JS基本数据类型:null undefined number boolean
string比较特殊
引用数据类型:function object array
var a = 11
var b = 1
b = 12
console.log(a)//11 a的值不会随b值得改变而改变
var a = [1,2,3]
var b = a
a[0] = 2
console.log(b[0]) //2, b的值随着a的值改变而改,因为他们指向同一个内存地址
var a = [1,2,3]
var b = a
b = [11, 12, 13]//b指向了另一个内存地址,与a断开关联
a[0] = 2
console.log(b[0]) //11,b的值不随a的值改变而改变
比如说 var a = 11是基本数据类型,因此变量a存放的就是1这个值
var b = [1,2,3],[1,2,3]是引用数据类型,[1,2,3]是放在内存中的,而变量b存放的是[1,2,3]的地址,而不是[1,2,3]这个值
当使用b这个变量时,js解释器会通过b存放的内存地址,找到内存中的相应地址,将其中的值取出来返回
在JavaScript中,方法往往涉及到上下文,也就是this,因此往往不能直接引用,就拿最常见的console.log("info…")来说,避免书写冗长的console,直接用log("info…")代替,不假思索的会想到如下语法:1 var log = console.log
2 log("info…")
很遗憾,运行报错:TypeError: Illegal invocation。
为啥呢?对于console.log("info…")而言,log方法在console对象上调用,因此log方法中的this指向console对象;而我们用log变量指向console.log方法,然后直接调用log方法,此时log方法的this指向的是window对象,上下文不一致,当然会报错了。
此时我们可以用bind方法解决这个问题。bind方法允许手动传入一个this,作为当前方法的上下文,然后返回持有上下文的方法,例如:
1 var log = console.log.bind(console)
2 log("info...")
这样就不会报错了。