一、数据类型
1.js内置数据类型(7种):string、number、boolean、undefined、null、symbol、object
(function和array属于object的子类型)
2.可使用typeof判断不同类型。
特殊:typeof null === 'object'
typeof function(){} === 'function'
对于未声明和未赋值的变量,typeof都返回undefined,阻止了报错,是个安全的防范机制。
3.null:空值。 是一个特殊关键字,不是标识符,我们不能将其当作变量来使用和赋值。
undefined :未赋值。是一个标识符,可以被当作变量来使用和赋值。
二、NaN:不是数字的数字
var a = 2/'a';
var b = 'b';
console.log(a); //NaN
console.log(b); //b
1.window.isNaN判断是否为NaN,在非数字类型的情况下也返回true(缺陷)
console.log(isNaN(a)); //true
console.log(isNaN(b)); //true
2.Number.isNaN(es6)在非数字类型的情况下也返回false(修改了window.isNaN缺陷)
console.log(Number.isNaN(a)); //true
console.log(Number.isNaN(b)); //false
3.完善Number.isNaN:
(1)判断是否为NaN方式一:为NaN有两个条件:是number类型和不为数字
if(!Number.isNaN) {
Number.isNaN = function(n) {
return (typeof n === 'number' && window.isNaN(n));
}
}
(2)判断是否为NaN方式二:NaN不等于自身(js中唯一一个不等于自身的值)
if(!Number.isNaN) {
Number.isNaN = function(n) {
return n != n;
}
}
三、对象的引用
1.对象直接赋值,进行浅拷贝
var array = [1,2,3];
var array1 = array; //复制了array的引用
array1[0] = 0;
console.log(array); //[0,2,3] 浅拷贝
console.log(array1); //[0,2,3] 浅拷贝
2.当两个变量的指向相同时,两个变量值的改变互相关联
array1.push(4); //[0,2,3,4]
console.log(array); //[0,2,3,4]
console.log(array1); //[0,2,3,4]
3.当两个变量的指向不同时,两个变量值的改变互不相关
array1 = [4,5,6];
console.log(array); //[0,2,3,4]
console.log(array1); //[4,5,6]
array1.push(7);
console.log(array); //[0,2,3,4]
console.log(array1); //[4,5,6,7]
4.例子:
function foo(x) {
x.push(4);
console.log(x); //[1,2,3,4]
x = [4,5,6];
x.push(7);
console.log(x); //[4,5,6,7]
}
var aa = [1,2,3];
foo(aa);
console.log(aa); // [1,2,3,4]
解析:
对象的实际值是在堆中,栈中存放的是引用地址。
foo(aa)时,aa赋值给x,x的引用地址和aa是一样的(直接赋值是浅拷贝)
x.push(4)时,引用地址指向的实际值改变为[1,2,3,4],这时候x和aa的值都为[1,2,3,4]
x = [4,5,6]时,x的引用地址改变了,aa的引用地址并没有变化
x.push(7)操作的是新的引用地址指向的值,跟旧的引用地址指向的值无关,所以aa依旧为[1,2,3,4]