一、字面量的赋值问题
var a = 1;
var b = a;
console.log(a); // 1
b = 2;
console.log(a); // 1
console.log(b); // 2
var b=a 时,创建了一个新的内存地址保存变量b和值,所以修改b的值不会影响a的值。
二、引用数据类型
var obj = {
fname: 'name',
age: 18
}
console.log(obj.age); // 18
var obj2 = obj;
obj2.age = 20;
console.log(obj.age); // 20
console.log(obj2.age); // 20
在引用数据类型中,对象是存在于内存地址的堆中,变量是在栈中,变量所存的值是对象的内存地址,也就是说变量指向对象,所以var obj2=obj 是将对象的内存地址给了obj2,obj2和obj指向同一个对象,所以通过修改obj2修改age,obj.age也会被修改.
三、检测数据类型的方式
1.typeof
function fun() {
console.log('我是函数');
}
console.log(typeof 10); // number
console.log(typeof 'abc'); // string
console.log(typeof true); // boolean
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof [1, 2, 3]); // object
console.log(typeof {fname: 'name'}); // object
console.log(typeof /^abc$/gim); // object
console.log(typeof fun) // function
注意:console.log(typeof null); // object
typeof 比较适合检测基本数据类型,不能打印出具体的引用数据类型。
2.instanceof
// Object
var obj1 = {
fullName: 'aaa',
age: 20
};
// Array
var arr1 = [1, 2, 3, 4, 5];
// Date
var date = new Date()
// RegExp
var reg1 = /hello/gim;
// Function
function foo(x, y) {
return x > y ? x : y;
}
// Error
var err = new Error('参数必须是数字类型');
// Null
var n = null;
// 使用 instanceof 操作符检测
console.log(obj1 instanceof Object) // true
console.log(arr1 instanceof Array) // true
console.log(date instanceof Date) // true
console.log(reg1 instanceof RegExp) // true
console.log(foo instanceof Function) // true
console.log(err instanceof Error) // true
console.log(n instanceof Object) // false
instanceof的返回值是布尔值,能够判断出对象的具体数据类型,除了null,也能判断出自定义对象类型
null使用typeof检测为Object,但是使用instanceof判断却为false,它就是js在设计之初遗留的错误,因为js已经使用比较广泛,就没有再改正。
3.Object.prototype.toString().call()
// Object
var obj1 = {
fullName: 'aaa',
age: 20
};
// Array
var arr1 = [1, 2, 3, 4, 5];
// Date
var date = new Date()
// RegExp
var reg1 = /hello/gim;
// Function
function foo(x, y) {
return x > y ? x : y;
}
// Error
var err = new Error('参数必须是数字类型');
// Null
var n = null;
// 使用 instanceof 操作符检测
console.log(Object.prototype.toString.call(obj1)); // '[object Object]'
console.log(Object.prototype.toString.call(arr1)); // '[object Array]'
console.log(Object.prototype.toString.call(date)); // '[object Date]'
console.log(Object.prototype.toString.call(reg1)); // '[object RegExp]'
console.log(Object.prototype.toString.call(foo)); // '[object Function]'
console.log(Object.prototype.toString.call(n)); // '[object Null]'
4.constructor,返回自定义对象的原型函数
function Fun(){
this.fname = 'aaa',
this.age = 18
}
var obj1 = new Fun();
console.log(obj1.constructor == Fun); // true
四、原型包装器的使用
为什么基本数据类型能有方法,如:string.length、string.substring、number.toFixed(),还有Boolean的一些。
因为js引擎为基本数据类型进行了复杂数据类型的包装,操作的大概过程如下(伪代码,便于理解):
var str = 'abc';
var temp = new String(str); // 创建临时变量
str = temp;
temp = null; // 销毁
number和boolean也是如此。