js-数据类型和类型转换

一,JS 数据类型

JS 中有 6 种(值)基本类型: boolean  number  string  undefined  null  symbol

引用类型:对象  数组  函数

 

二,JS 中使用 typeof 能得到哪些类型?

其中一个奇怪的 null,虽然是基本变量,但是因为设计的时候`null`是全 0,而对象是`000`开头,所以有这个误判。

1. boolean
2. number
3. string
4. undefined
5. symbol
6. **object**
7. **function**

typeof null  → object    typeof array → object

 

三,instanceof 能正确判断对象的原理是什么?

判断一个对象与构造函数是否在一个原型链上

const Person = function () {};
const p1 = new Person();
p1 instanceof Person; // true

var str = "hello world";        //注意
str instanceof String; // false

var str1 = new String("hello world");  
str1 instanceof String; // true

 

四,如何判断一个数据是不是 Array

- `Array.isArray(obj)`
- ECMAScript 5 种的函数,当使用 ie8 的时候就会出现问题。
- `obj instanceof Array`
- 当用来检测在不同的 window 或 iframe 里构造的数组时会失败。这是因为每一个 iframe 都有它自己的执行环境,彼此之间并不共享原型链,所以此时的判断一个对象是否为数组就会失败。此时我们有一个更好的方式去判断一个对象是否为数组。
- `Object.prototype.toString.call(obj) == '[object Array]'`
- 这个方法比较靠谱
- `obj.constructor === Array`
- constructor 属性返回对创建此对象的函数的引用

  

五,Object.prototype.toString  与 obj.toString()

Object.prototype.toString

如果是原始类型,他会将原始类型包装为引用类型,然后调用对应方法

function dd() {}
var toString = Object.prototype.toString;
toString.call(dd); //[object Function]
toString.call(new Object()); //[object Object]
toString.call(new Array()); //[object Array]
toString.call(new Date()); //[object Date]
toString.call(new String()); //[object String]
toString.call(Math); //[object Math]
toString.call(undefined); //[object Undefined]
toString.call(null); //[object Null]
toString.call(123); //[object Number]
toString.call("abc"); //[object String]

同样是检测对象 obj 调用 toString 方法,obj.toString()的结果和 Object.prototype.toString.call(obj)的结果不一样,这是为什么?

这是因为 toString 为 Object 的原型方法,而 Array ,function 等类型作为 Object 的实例,都重写了 toString 方法。不同的对象类型调用 toString 方法时,根据原型链的知识,调用的是对应的重写之后的 toString 方法(function 类型返回内容为函数体的字符串,Array 类型返回元素组成的字符串.....),而不会去调用 Object 上原型 toString 方法(返回对象的具体类型),所以采用 obj.toString()不能得到其对象类型,只能将 obj 转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用 Object 上原型 toString 方法。

六,实现一个类型判断函数

1. 判断 null
2. 判断基础类型
3. 使用`Object.prototype.toString.call(target)`来判断**引用类型**

注意: 一定是使用`call`来调用,不然是判断的 Object.prototype 的类型
之所以要先判断是否为基本类型是因为:虽然`Object.prototype.toString.call()`能判断出某值是:number/string/boolean,但是其实在包装的时候是把他们先转成了对象然后再判断类型的。 但是 JS 中包装类型和原始类型还是有差别的,因为对一个包装类型来说,typeof 的值是 object

/**
* 类型判断
*/
function getType(target) {
//先处理最特殊的Null
if (target === null) {
return "null";
}
//判断是不是基础类型
const typeOfT = typeof target;
if (typeOfT !== "object") {
return typeOfT;
}
//肯定是引用类型了
const template = {
"[object Object]": "object",
"[object Array]": "array",
// 一些包装类型
"[object String]": "object - string",
"[object Number]": "object - number",
"[object Boolean]": "object - boolean",
};
const typeStr = Object.prototype.toString.call(target);
return template[typeStr];
}

  

七,js类型转换

看这里:JS 类型转换规则总结

 

posted @ 2020-09-15 21:11  北巷听雨  阅读(382)  评论(0)    收藏  举报
返回顶端