js的基本数据类型和引用数据类型的相关问题

一、字面量的赋值问题

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也是如此。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值