之前因为一些事情离开了一段时间,现在打算开一个系列,记录刷红宝书时遇到的一些疑惑点和个人理解。
首先,JavaScript的内置类型有7种:
- Null
- Undefined
- Boolean
- String
- Number
- Object
- Symbol(es6)
在检测基本数据类型的时候,一般用typeof,typeof会返回一个表示数据类型的字符串。有两点需要注意的是:
- typeof null //"object"
- 对未初始化和未声明的变量执行typeof操作都会返回"undefined"。(对未声明的变量只能进行一种操作,即typeof)
在检测引用类型值的时候,我们需要知道它具体是什么类型的对象,这个时候typeof就没用了,需要用到instanceof。例如:
- [1,2] instanceof Array //true
同样,也可以用object的原型对象方法toString检测,例如:
var obj = [1, 2];
Object.prototype.toString.bind(obj)().slice(8, -1); //Array下面聊一下js的变量。js是弱类型语言,在声明变量的时候,无需像java一样规定它是int还是string或是其他,用一个var就能搞定(es5)。甚至,可以用一个原本保存数值的变量再去保存字符串,对象等(实际编码时应该尽量避免)。因此,不难理解js的变量是没有类型的,变量保存的值才有类型。
这篇文字的侧重点在后面的引用,因此前面的内容只写了个大概,上述的点每个地方展开都有很多内容可写,想了解的可以自行查找下资料。
理解js引用的工作机制,最关键需要知道js的引用指向的是值而不是另一个变量。在红宝书第四章关于变量复制所给出的图示我们可以得到以下结论:基本类型值的复制是复制值,引用类型的复制是复制“指针”,这个指针指向内存空间的对象。
var num = 5;
var num_copy = num;
num++;
num //6
num_copy //5 var obj = [1, 2];
var obj_copy = obj;
obj.push(3);
obj //[1,2,3]
obj_copy //[1,2,3]其结果就是,基本类型复制后得到的两个变量保存的值相同,但互不相关。引用类型复制后得到的两个变量保存的值都是一个指针,指向同一个对象,因此改变任一一个,引用的对象发生改变,另一个变量也随之改变。
基本类型和引用类型作为函数参数传递时理解起来可能会有些困惑。在js中所有函数的参数都是按值传递,也就是说我们在给函数传递参数的时候,过程就和上面说的变量复制是一样的。
function add(num) {
num++;
return num;
}
var zero = 0;
var result = add(zero); //zero = 0,result =1 function handleArray(x) {
x.push(8);
x = [1, 2, 3];
}
var arr = [1];
handleArray(arr);
arr; //[1,8]在方法handleArray中,我们向函数传递arr,此时参数x通过引用复制拿到指向保存数组 [1]的指针,arr和参数x指向同一个对象。方法中向数组添加一项,arr和参数x指向的对象变为[1,8],然后将参数x指向数组[1,2,3],但是arr的指向没有改变,所以访问arr得到的结果是[1,8]。如果需要让arr和参数x始终表现一致,我们只能通过修改它们共同指向的对象达到目的。那么,到这里你可能会想,怎样才能让基本类型和引用类型在做函数参数传递的时候的表现对调?
首先,关于上面的叙述,我们需要明确两点:
- 基本类型值在复制,传递时是通过值复制;引用类型则是通过引用复制(复制的是“指针”)
- js函数是值传递。
因此,想做到表现对调,我们需要对数据进行“包装”,将基本类型包装到对象中,将引用类型通过值复制的方式创建一个副本。
暂时写到这,以后有这块的新想法再做更新,也欢迎大家提出宝贵的意见。
本文详细介绍了JavaScript中的数据类型,包括基本类型与引用类型的区别,以及如何使用typeof和instanceof来检测变量类型。同时,文章还探讨了变量复制时基本类型与引用类型的差异,并讨论了这些类型在函数参数传递中的行为。
1万+

被折叠的 条评论
为什么被折叠?



