本文解决痛点:对象里面是否有值

1.通过 JSON 自带的 stringify() 方法来判断

JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串。

if (JSON.stringify(data) === '{}') {
    return false // 如果为空,返回false
}
return true // 如果不为空,则会执行到这一步,返回true

这里需要注意为什么不用 toString(),因为它返回的不是我们需要的。

var a = {}
a.toString() // "[object Object]"

2.for...in... 遍历属性,为真则为“非空数组”;否则为“空数组”

for (var i in obj) { // 如果不为空,则会执行到这一步,返回true
    return true
}
return false // 如果为空,返回false

3.ES6 新增的方法 Object.keys()

Object.keys() 方法会返回一个由给定对象的自身可枚举属性组成的数组。 如果我们的对象为空,他会返回一个空数组,如下:

var a = {}
Object.keys(a) // []
if (Object.keys(object).length === 0) {
    return false // 如果为空,返回false
}
return true // 如果不为空,则会执行到这一步,返回true

之后会写一些 js 常用的技巧,原理链和容易混淆的概念,希望能帮助到一些人。由于能力有限,可能理解有误,欢迎指出

拆箱和装箱

typeof

对于基本类型, 除 null 以外, 均可以返回正确的结果. 对于引用类型, 除 function 以外, 一律返回 object 类型. 对于 null, 返回 object 类型 对于 function, 返回 function 类型

其中,null 有属于自己的数据类型 Null , 引用类型中的 数组、日期、正则 也都有属于自己的具体类型,而 typeof 对于这些类型的处理,只返回了处于其原型链最顶端的 Object 类型,没有错,但不是我们想要的结果。

所谓的装箱,是指将基本数据类型转换为对应的引用类型的操作。而装箱又分为隐式装箱和显式装箱。

隐式装箱当读取一个基本类型值时,后台会创建一个该基本类型所对应的基本包装类型对象。

隐式装箱当读取一个基本类型值时,后台会创建一个该基本类型所对应的基本包装类型对象。

类型的判断 使用 Object.prototype.toString 判断数据类型

const type = obj => {
    var toString = object.prototype.toString;
    var map = {
        '[object Array]': 'array'
        '[object Object]': 'object'
    };
    return map[toString.call(obj)];
}

typeof 可以区分基础数据类型, 但是没办法判断对象 object

console.log(typeof function () {});//function

console.log(typeof null);//object

console.log(typeof {});//object

console.log(typeof []);//object

instanceof:

检测一个引用数据类型属于的类,检测构造函数的 prototype 属性是否出现在某个实例对象的原型链,要注意,是检测引用数据类型,基础数据类型不能检测(引用数据类型也都是Object的子类):

console.log(1 instanceof Number);//false

console.log('s' instanceof String);//false

console.log(true instanceof Boolean);//false

console.log(Function instanceof Function);//true

console.log(Function instanceof Object);//true

console.log([] instanceof Array);//true

console.log([] instanceof Object);//true

console.log({} instanceof Object);//true

function User() {};

let user = new User();

console.log(user instanceof User);//true
  • 函数参数为基本数据类型时, 函数体内复制了一份参数值,任何操作都不会影响原参数的实际值

  • 函数参数是引用类型时, 当在函数体内修改这个值的某个属性值时,将会对原来的参数进行修改

  • 函数参数是引用类型时, 如果直接修改这个值的引用地址, 则相当于在函数体内新创建了一个引用,任何操作都不会影响愿参数的实际值

最后更新于

这有帮助吗?