菜鸟笔记-数据类型

 一 数据类型分类

1. 普通类型: string number boolean null undefined

2. 对象类型(object): function Array Date RegExp Error

二 类型检测

Js 中类型检测方法:

1.typeof

typeof 1
"number"
typeof "anna"
"string"
typeof true
"boolean"
typeof null
"object"
typeof undefined
"undefined"
typeof function(){}
"function"
typeof [1,3,4]
"object"
typeof new Date()
"object"

 

2.instanceof (obj instanceof Object)

instanceof 运算符用于一个构造函数的prototype属性所指向的对象是否存在另一个要检测的对象上。
instanceof坑:不同window或iframe之间的对象类型检测不能使用instanceof!
instanceof在判断对象是不是数组,Data,正则等时很好用。

(1) 普通用法

function Person(){};
var p =new Person();
console.log(p instanceof Person);//true


(2) 继承中判断实例是否属于它的父类

function Person(){};
function Student(){};
var p = new Person();
Student.prototype = p;
var s = new Student();
console.log(s instanceof Student)// true
console.log(s instanceof Person) // true

 
(3) 复杂用法

function Person(){}
console.log(Object instanceof Object)//true
//第一个Object的原型链:Object=>
Object._proto_ => Fuction.prototype => Function.prototype._proto_ => Object.prototype
//第二个Object的原型:Object => Object.prototype

console.log(Function instanceof Function);
//第一个Function的原型链: Function => Function._proto_ => Function.prototype
//第二个Function的原型:Function => Function.prototype

console.log(Function instanceof Object);//true
//Function => Function._proto_ => Function.prototype => Function.prototype._proto => Object._proto_
//Object => Object.prototype

console.log(Person instanceof Function);//true
//Person => Person._proto_ => Function.prototype
//Object => Object.prototype

console.log(String instanceof String);   //false
//第一个String的原型链:String=>
//String.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
//第二个String的原型链:String=>String.prototype

console.log(Boolean instanceof Boolean); //false
//第一个Boolean的原型链:Boolean=>
//Boolean.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
//第二个Boolean的原型链:Boolean=>Boolean.prototype

console.log(Person instanceof Person); //false
//第一个Person的原型链:Person=>
//Person.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype
//第二个Person的原型链:Person=>Person.prototype

总结
模拟函数 A instanceof B

function _instanceof(A, B){
 var o = B.prototype;//取B的显示原型
 A = A._proto_;//取A的隐式原型
 while (true){
  //Object.prototype._proto_ === null
  if(A === null) return false;
  if(o === A) return true;重点:当 o 严格等于A 时,返回 true
  A = A._proto_;
 }
}


//一张图理解prototype、proto和constructor的三角关系 (参考此博文,可以详细了解原型链)
https://www.cnblogs.com/xiaohuochai/p/5721552.html

3.Object.prototype.toString
Object.prototype.toString.apply([])
"[object Array]"
Object.prototype.toString.apply(function(){})
"[object Function]"
Object.prototype.toString.apply(null)
"[object Null]"
Object.prototype.toString.apply(undefined)
"[object Undefined]"


需要注意的是IE6/7/8中 Object.prototype.toString.apply(null)返回“[object Object]”。

4.constructor
function Student(){};
Student.prototype.constructor === Student


//一张图理解prototype、proto和constructor的三角关系 (参考此博文,可以详细了解原型链)
https://www.cnblogs.com/xiaohuochai/p/5721552.html

5.如何检测一个变量是字符串

有另外一种方法:将变量和空字符拼接后再和原来变量做全等判断
 var str = "Joanna";
var temp = str + '';
temp === str
true

 

三 显式转换和隐式转换

A.显式转换:

1. Number:

(1)原始类型值的转换规则

Number: 不变

String: 如果可以被解析为数值,则转换为相应的数值,否则得到NaN。空字符串转为0。

Boolean:true转成1,false转成0。

undefined:转成NaN。

null:转成0。

(2)对象的转换规则

先调用对象自身的valueOf方法,如果该方法返回原始类型的值(数值、字符串和布尔值),则直接对该值使用Number方法,不再进行后续步骤。

如果valueOf方法返回复合类型的值,再调用对象自身的toString方法,如果toString方法返回原始类型的值,则对该值使用Number方法,不再进行后续步骤。

如果toString方法返回的是复合类型的值,则报错。

2. String

(1)原始类型值的转换规则

数值:转为相应的字符串。

字符串:转换后还是原来的值。

布尔值:true转为“true”,false转为“false”。

undefined:转为“undefined”。

null:转为“null”

(2)对象的转换规则


 如果要将对象转为字符串,则是采用以下步骤。

 先调用toString方法,如果toString方法返回的是原始类型的值,则对该值使用String方法,不再进行以下步骤。

 如果toString方法返回的是复合类型的值,再调用valueOf方法,如果valueOf方法返回的是原始类型的值,则对该值使用String方法,不再进行以下步骤。

 如果valueOf方法返回的是复合类型的值,则报错。

// String方法的这种过程正好与Number方法相反


Boolean函数

以下六个值的转化结果为false,其他的值全部为true。

    undefined
    null
    -0
    +0
    NaN
    ''(空字符串)

(2)对象的转换规则

所有对象的布尔值都是true,甚至连false对应的布尔对象也是true。

Boolean(new Boolean(false))
// true

请注意,空对象{}和空数组[]也会被转成true。

Boolean([]) // true

Boolean({}) // true


B.隐式转换

+           200 + '3' 变成字符串
- * / %         '200' - 3 变成数字
++ --        变成数字
> <         数字的比较 、字符串的比较
! 取反         把右边的数据类型转成布尔值
==

// alert( Number('……') ); NaN
// alert( '……'-9 ); NaN
//NaN 数据类型转换失败的时候,会返回NaN;

// alert( '2' == 2 ); //true
// alert('10'>9) 返回true, 此时是数字的比较
// alert( '10000000' > '9' ); 返回false,此时是字符串的比较,比较的是二者的编码;
// > < 是数字的比较与字符串的比较
// alert(!'ok'); 这时候返回false
在预期为布尔值的地方,系统会自动调用内部的Boolean方法来转换
// Boolean方法 可以将任意类型的变量转为布尔值

'+'运算符

字符串: 两个运算子之中,只要有一个是字符串,则另一个不管是什么类型,都会被自动转为字符串,然后执行字符串连接运算

两个运算子都为数值或布尔值   //   这种情况下,执行加法运算,布尔值转为数值(true为1,false为0)

运算子之中存在对象(或者准确地说,存在非原始类型的值),则先调用该对象的valueOf方法。如果返回结果为原始类型的值,则运用上面两条规则;否则继续调用该对象的toString方法,对其返回值运用上面两条规则。

'a==b'

'123' == 123
0 == false
null == undefined
new Object() == new Object()
[1,2] == [1,2]

'a===b'
null === null
true
undefined === undefined
true
NaN === NaN
false
new Object() === new Object()
false

四  常见面试题分享

1.JS变量按照存储方式区分为哪些类型,并描述其特点

答案:值类型和引用类型    值类型存储的是值   赋值之后原变量的值不改变   引用类型存储的是地址  赋值之后是把原变量的引用地址赋值给新变量  新变量改变原来的会跟着改变

//值类型
var a = 10
var b = a
a = 11
console.log(b) //10

//引用类型
var obj1 = {x:100}
var obj2 = obj1
obj1.x = 200
console.log(obj2.x) //200
posted @ 2018-06-26 17:32  仙人酱酱  阅读(93)  评论(0编辑  收藏  举报