1
1
---
2
2
layout : post
3
- title : JS基础及常见面试考点一
3
+ title : JS基础一 -- 数据类型
4
4
date : 2018-12-27 00:00:00 +0800
5
5
categories : JavaScript
6
6
tag : js基础
@@ -13,31 +13,73 @@ tag: js基础
13
13
#### <font color =" #65A5EA " size =" 3 " >1. 数据类型(7种)</font > {#say-goodbyte}
14
14
15
15
* 6种基本类型:String、Number、Boolean、Null、Undefined、Symbol
16
- * 1种引用类型(对象):Object
17
-
18
- ##### <font color =" #65A5EA " size =" 2 " >1.1 基本类型和对象的区别:</font > {#say-goodbyte}
19
- 基本类型没有自己的属性和方法。对象有自己的属性和方法。
20
- 但是,为什么有的基本类型也可以调用方法呢?比如 123.toString()
21
- 因为除了 null、undefined 以外的基本类型都有与之对应的特殊的引用类型——包装类型。当代码被解释执行时,底层会将基本类型转换成引用类型,这样基本类型就可以调用相应引用类型有权访问到的方法。
22
-
23
- ##### <font color =" #65A5EA " size =" 2 " >数据类型的判断:</font > {#say-goodbyte}
24
- typeof 用于判断除null之外的基本类型
25
- 对于除了 null 之外的基本类型,可以通过 typeof 获得正确的数据类型。 (typeof null //Object)
26
- 对于除了function 之外的对象,typeof 都会返回 object 。 (typeof Function//function)
27
- instanceOf 用于判断一个实例是否属于某种类型,返回boolean
28
- 除了Object 和 Function 之外,instanceof 自己等于false。
29
- console.log(Object instanceof Object);//true
30
- console.log(Function instanceof Function);//true
31
- console.log(Function instanceof Object);//true
32
- console.log(Number instanceof Number);//false
33
- console.log(String instanceof String);//false
34
- Object.prototype.toString.call(xx) 用于获取XX正确的数据类型,返回[ Object Type] 的字符串
35
- 因为toString可以读取到数据的className
36
- 为什么使用Object原型上的toString方法就可以获取类型呢?
37
- 因为所有类型都是object的实例,toString方法可以读取对象的内部属性[[ class]] 。
38
- 为什么不直接使用toString呢?因为toString为Object的原型方法,而Array、function、Date等类型作为Object的实例,都重写了toString方法。
39
-
40
- 修改模板代码 {#change-template-code}
41
- ---------------------
42
- 修改` _includes/LessOrMore/comments-providers/yungentie ` 文件中的内容,将文件中的代码全部删除,并粘贴刚刚从云跟帖网站复制的代码。
16
+ * 1种引用类型(对象):Object
17
+
18
+ ** 本地对象、内置对象和宿主对象:**
19
+ ECMA-262 把本地对象(native object)定义为“独立于宿主环境的 ECMAScript 实现提供的对象”。常见的本地对象有 String、Boolean、Number、Object、Function、Array、Date、RegExp、Error、ReferenceError等。其实,本地对象就是es中定义的引用类型。
20
+ ECMA-262 把内置对象(built-in object)定义为“由 ECMAScript 实现提供的、独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现”。即内置对象是本地对象的子集,但是内置对象不是需要手动实例化,而是在在程序开始执行时已经被实例化了。如 Global、Math。在 ECMAScript 中,所有函数必须是某个对象的方法,比如parseInt 可以直接调用,事实上 parseInt 就是 Global 对象上的方法。调用 Math 对象上的方法不需要实例化,直接调用即可, Math.ceil()。
21
+ 宿主对象是指由宿主环境提供的对象,对于嵌入到网页中的 js 而言,浏览器就是其宿主环境,提供 BOM、DOM、console 等宿主对象。
22
+ #### <font color =" #65A5EA " size =" 3 " >2. 基本类型和对象的区别</font > {#say-goodbyte}
23
+ 基本类型没有自己的属性和方法。对象有自己的属性和方法。
24
+ ** 但是,为什么有的基本类型也可以调用方法呢?比如 123.length**
25
+ 那是因为除了 null、undefined 以外的基本类型都有与之对应的特殊的引用类型——包装类型。当代码被解释执行时,底层会将基本类型转换成引用类型,这样基本类型就可以调用与之相对应的引用类型的属性和方法。
26
+
27
+ #### <font color =" #65A5EA " size =" 3 " >3. 数据类型判断的五种方法</font > {#say-goodbyte}
28
+ ** (1)typeof 返回数据类型,常用于判断除null之外的基本类型**
29
+ 对于除了 null 之外的基本类型,可以通过 typeof 获得正确的数据类型。 (typeof null //Object)
30
+ 对于除了function 之外的对象,typeof 都会返回 object 。 (typeof Function//function)
31
+ ** (2)instanceOf 返回boolean,用于判断一个实例是否属于某种类型,会追溯原型链**
32
+ 除了Object 和 Function 之外,instanceof 自己等于false:
33
+ Object instanceof Object //true
34
+ Function instanceof Function //true
35
+ Function instanceof Object //true
36
+ Number instanceof Number //false
37
+ String instanceof String //false
38
+ var num1 = new Number(); num1 instanceOf Number //true
39
+ var num2 = '123'; num2 instanceOf Number //false
40
+ ** (3)Object.prototype.toString.call(xx) 用于获取XX正确的数据类型,返回[ Object Type] 的字符串**
41
+ 因为所有类型都是 object 的实例,toString 方法可以读取对象的内部属性[[ class]] 。
42
+ 为什么不直接使用 toString 呢?因为 toString 为 Object 的原型方法,而 Array、function、Date 等类型作为Object的实例,都重写了 toString 方法。
43
+ ** (4)constructor 是 object 对象的一个属性,用于判断 object 类型的数据**
44
+ var arr = [ 1,2,3] ;
45
+ arr.constructor == Array //true
46
+ ** (5)isArray es6提供的新方法,返回boolen,用于判断数组类型**
47
+ var arr = [ 1,2,3] ;
48
+ Array.isArray(arr) //true
49
+
50
+ #### <font color =" #65A5EA " size =" 3 " >4. 数据类型转换</font > {#say-goodbyte}
51
+ ** 在条件判断时,除了 undefined, null, false, NaN, '', 0, -0,其他所有值都转为 true,包括所有对象。**
52
+ 另规定,console.log(null==null && undefined==undefined && null==undefined)
53
+ ** 对象在转换基本类型时,会优先将值转换为原始值(toPrimitive优先级最高),再转换为数字(valueOf),最后转换为字符串(toString)。**
54
+ ** 在 + 号两侧,如果一方不是字符串或数字,则会将它转换为字符串或数字:**
55
+ '1'+'-2' //'1-2' 仅仅是字符串拼接
56
+ [ 1,2] +[ 1,2] // '1,21,2'
57
+ <font color =" red " size =" 2 " >解析:数组调用 valueof 得到基本类型的值,所以调用 toString 把数组转成字符串 </font >
58
+ ** 在 == 号两侧,会隐式地把布尔值转换成 number:**
59
+ if({}){console.log(4)} //true -- 4
60
+ if({}==false){console.log(5)} //false
61
+ if({}==!{}){console.log(6)} //false
62
+ if({}=={}){console.log(7)} //false
63
+
64
+ if([ ] ){console.log(1)} //true -- 1
65
+ if([ ] ==false){console.log(2)} //true -- 2
66
+ if([ ] ==[ ] ){console.log('')} //false
67
+ if([ ] ==![ ] ){console.log(3)} //true -- 3
68
+ <font color =" red " size =" 2 " >解析:[ ] ==![ ] ----> [ ] ==false -----> [ ] == 0 -----> 0 == 0 --->//true </font >
69
+ 熟悉常见的优先级,如!非 的优先级最高。
70
+
71
+ #### <font color =" #65A5EA " size =" 3 " >5. 深拷贝和浅拷贝</font > {#say-goodbyte}
72
+ ** 基本类型和引用类型的区别是:**
73
+ 基本数据类型存储在栈中,引用类型存储在栈中的是一个地址,这个地址指向堆中的存储的对象;
74
+ 基本类型是传值,引用类型是传址,引用类型存在深浅拷贝。
75
+ ##### <font color =" #65A5EA " size =" 2 " >浅拷贝</font >
76
+ (1)Object.assign()
77
+ > Object.assign(target, ...sources)
78
+ * //用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。返回目标对象。*
79
+
80
+ (2)扩展符
81
+ ##### <font color =" #65A5EA " size =" 2 " >深拷贝</font >
82
+ (1)JSON.parse(JSON.stringify(obj1))
83
+
84
+ (2)递归
43
85
0 commit comments