let a = {},b = '0',c = 0;
a[b] = '张三'
a[c] = '李四'

console.log(a[b])        //李四

对象中,数字属性名和字符串属性名都是一样的,数组是特殊的字符串

拓展:对象和数组的区别

let a={}, b=Symbol('1'), c=Symbol('1');  
a[b]='张三';    
a[c]='李四';  
console.log(a[b]);    //张三

Symbol创建的是唯一的值,不相等。对象的属性名不一定是字符串,如果是数字和字符串则是同一个值,因为索引是字符串。对象的属性名可以是不二null,Symbol、undefined等等。引用类型值都是变成字符串逆行存储。

拓展:自己实现一个Symbol

let a={}, b={n:'1'}, c={m:'2'};  
a[b]='张三';
a[c]='李四';  
console.log(a[b]);    //李四

b、c作为引用的时候会被转化成为字符串,对象转化toString那么即[Object Object],两个都是[Object Object],所以结果是李四

拓展:Object.prototype.toString项目中应用,跟valueOf跟toString区别(编译顺序)

基本类型直接存储,引用类型要放进堆里面,最终是把地址复制给这个值。

浏览一加载页面,就形成一个栈内存。每个函数执行,叫做把一个执行上下文压缩到栈中执行。

null和undefined

//立即执行函数,执行完被销毁,回收机制。但是由于i被占用因此不销毁。test表示的不是一个函数,而是一个函数返回的执行结果
var test = (function(i){
    return function(){
        alert(i*=2);    //没有i,那么在它上级作用域中找。在哪创建的上级作用域就是谁
    }
})(2);
test(5);        //字符串4。test中没有形参。

alert输出的结果都是会转化成字符串的。

var a=0,
    b=0;
function A(a){
    A=function(b){
        alert(a+b++);
    };
    alert(a++);
}
A(1);        //"1"
A(2);        //"4"

注意: a++先跟别人运算,再自身累加1;++a先自身累加1,再跟别人运算。

过程解释:

1、GO全局:初始化 a = 0,b = 0, A一个方法,引用地址,此处暂时记为AAAFFF000

2、A(1)执行,传入形参,此时在执行中a= 1,往下中性,A = function…,此处相当于重新定义了全局的方法A,改变了原来的方法A的指向,此处引用地址从AAAFFF000改变到另外一个记为BBBFFF000,继续执行alert(a++),由于a=1,并且由于下面demo可以看出,a是在执行之后再自身加1的,那么此时alert的是没有叠加之前的1

3、继续执行A(2),那么此时A指向的function是改变之后的BBBFFF000,此时传入的形参b=2,而a在其上一级作用域中,由步骤2可知,叠加之后为2,那么此时alert出来的应该是2+2,为字符串4(alert出来的会自动同toString转化)

let a = 1;
console.log(5+a++);    //6
console.log(a)    //2

let b = 1;
console.log(5+(++a));    //7
console.loog(a)        //2

results matching ""

    No results matching ""