js中的内置类型
2020-06-20 本文已影响0人
练习时长2年半的个人练习生
内置类型
js一共有七种内置类型
- Number
- String
- Boolean
- null
- undeifned
- Object
- Symbol
Array Function Map Set 等都属于Object的子类型
其中除了Object都是值类型, Object是引用类型
判断类型
-
通过typeof 可以判断除了null之外的六种类型,typeof null 返回值是ojbect 这是js的一个bug
可以通过以下方法判断
let a= null;
(!a && typeof a == 'object') //true
补充:!运算符判断各种类型的结果
let a;
console.log(!a)
let b = null
console.log(!b)
let c = 0
console.log(!c)
let d = undefined
console.log(!d)
Function类型
- Function是Object的子类型.具体说就是一个可调用的对象.它有一个内部属性[[call]]该属性使其可以被调用.
- 函数不仅是对象,还可以拥有属性, length 就是表示函数声明时的参数个数.除此外还可以对他添加自定义属性
function fn (a,b){}
fn.sex ="男"
console.log(fn.sex)//男
console.log(fn.length)//2
- instanceof运算符 本身就不是用来判断类型的.而是用来判断 函数对象的prototype 有没有出现在对象的原型链上. 所以说用instanceof来判断类型本身就不合理.
所以才会出现以下情况
let str = '123';
console.log([1,2,3] instanceof Array)//true
console.log([1,2,3] instanceof Object) //true
因为所有类型的实例的[[prototype]]都会关联到Object.prototype
所有任何类型的实例都能调用Object.prototype上的toString方法,
每个类型又对toString进行了改写.所以,还得用Object.prototype上的toString 方法
let str ='AAA'
console.log(str.__proto__ === String.prototype)
console.log(String.prototype.__proto__ === Object.prototype )
let num =11
console.log(num.__proto__ === Number.prototype)
console.log(Number.prototype.__proto__ === Object.prototype )
function fn(){}
console.log(fn.__proto__ == Function.prototype)
console.log(Function.prototype.__proto__ == Object.prototype)
//都返回true
Object.prototype.toString返回一个表示该对象的字符串。
Array ,String,Number 等在自己的原型上对该方法进行了重写
let letters = {
a: 1,
b: 'strings',
c: undefined,
d: new Map(),
e: new Set(),
f: null,
g: {},
h: [],
i: Symbol(),
j: function () { },
k: true,
}
for (let key in letters) {
let dataType = Object.prototype.toString.apply(letters[key])
console.log(type)
}
// [object Number]
// [object String]
// [object Undefined]
// [object Map]
// [object Set]
// [object Null]
// [object Object]
// [object Array]
// [object Symbol]
// [object Function]
// [object Boolean]