众所周知 JavaScript(一下简称 Js) 是一门弱类型语言,变量的类型不够明确,不一样类型之间能够相互赋值。
Js 的数据类型能够分为两大类:
![]()
es6
基础数据类型包含如下
中:数组
// 字面量的形式声明
var num = 23
console.log(num) // 23
// 实例化的形式声明
var num = new Number(23)
console.log(num) // 23
复制代码
var num = 23
复制代码
var num = 23.5
复制代码
var num = 1.5e12 // 表示1.5乘以10的7次方
var num = 1.5-e12 // 表示1.5除以10的7次方
复制代码
已 0 开头,后面的数字为任意的 0-7bash
var num = 070 // 等于十进制的 56
复制代码
转换规则:7 x + 7 x
= 56函数
已 0x 开头,后面的数字为任意的 0-F (字母能够是大写的,也能够是小写的)测试
var num = 0x1f // 等于十进制的 31
复制代码
转换规则:1 x + 15 x
= 31ui
尽管全部整数均可以表示为八进制或十六进制的字面量,但全部数学运算返回的都是十进制结果。编码
console.log(NaN == NaN) // false
console.log(NaN === NaN) // false
复制代码
console.log(isNaN(NaN)) // true
console.log(isNaN(6)) // false
复制代码
// 字面量的形式声明
var str = 'hello'
console.log(str) // hello
// 实例化的形式声明
var str = new String("hello")
console.log(str) // hello
复制代码
// 字面量的形式声明
var flag = false
console.log(flag) // false
// 实例化的形式声明
var flag = new Boolean(false)
console.log(flag) // false
复制代码
注意:spa
Undefined 类型只有一个值,即 undefined。
3d
var num
console.log(num)
复制代码
var oTemp;
alert(typeof oTemp); //输出 "undefined"
alert(typeof oTemp2); //输出 "undefined"
复制代码
前面的代码对两个变量输出的都是 "undefined",即便只有变量 oTemp2 从未被声明过。若是对 oTemp2 使用除 typeof 以外的其余运算符的话,会引发错误,由于其余运算符只能用于已声明的变量上。
复制代码
null 类型只有一个值,即 null。指针
console.log(null == undefined) // true
console.log(null === undefined) // false
console.log(null == null) // true
console.log(null == null) // true
复制代码
Symbol 是 es6 新增的一种基础数据类型,是用来描述一个
的值。 Symbol(query: any): symbol query 对当前 Symbol 的描述,便于代码的阅读
var symbol1 = Symbol('symbol')
var symbol2 = Symbol('symbol')
console.log(symbol1 === symbol2) // false
console.log(symbol1 === symbol2) // false
复制代码
引用数据类型包含如下
中:
var num = 12
console.log(typeof num) // number
var str = 'hello'
console.log(typeof str) // string
var flag = true
console.log(typeof flag) // boolean
var un
console.log(typeof un) // undefined
var nul = null
console.log(typeof nul) // object
var fun = function () {}
console.log(typeof fun) // function
var obj = new Object()
console.log(typeof obj) // object
var arr = [1, 2]
console.log(typeof obj) // object
复制代码
由上可知:
var obj = new Object()
console.log(obj instanceof Object) // true
var str = new String('hello')
console.log(str instanceof String) // true
var arr = [1, 2]
console.log(arr instanceof Array) // true
var num = 1
console.log(num instanceof Number) // false
复制代码
总结:
咱们先来看一个例子,思考一下答案是什么
var num1 = 10
var num2 = num1
num2 = 20
console.log(num1, num2)
var person1 = {name: 'Tom'}
var person2 = person1
person2.name = "Kail"
console.log(person1, person2)
复制代码
答案:
10 20
{name: 'Kail'} {name: 'Kail'}
能够看出 num1 不会受到 num2 的影响,person1 会受到 person2 的影响。
复制代码
总结:
浅拷贝、深拷贝的出现就是为了解决引用数据类型赋值时,产生相互影响的问题
复制代码
浅拷贝
仍是不能完全解决多层引用数据类型之间的嵌套。
var person1 = {name: 'Tom'}
var person2 = Object.assign({}, person1)
person2.name = "Kail"
console.log(person1, person2) // {name: "Tom"} {name: "Kail"}
var person1 = {targe: {name: 'Tom'}}
var person2 = Object.assign({}, person1)
person2.targe.name = "Kail"
console.log(person1, person2) // {targe: {name: 'Kail'}} {targe: {name: 'Kail'}}
复制代码
深拷贝跟层级无关
var person1 = {name: 'Tom'}
var person2 = JSON.parse(JSON.stringify(person1))
person2.name = "Kail"
console.log(person1, person2) // {name: "Tom"} {name: "Kail"}
var person1 = {targe: {name: 'Tom'}}
var person2 = JSON.parse(JSON.stringify(person1))
person2.targe.name = "Kail"
console.log(person1, person2) // {targe: {name: 'Tom'}} {targe: {name: 'Kail'}}
复制代码
var log = console.log
log(1 + 2) // 3
log(1 + '2') // '12'
log(1 + true) // 2
log('1' + true) // '1true'
log('1' + undefined) // '1undefined'
log(1 + undefined) // NaN
log('1' + null) // '1null'
log(1 + null) // 1
log(1 + []) // '1'
log(1 + [2]) // '12'
log(1 + [2, 3]) // '12,3'
log(1 + [{count: 2}]) // '1[object Object]'
log(1 + [{count: 2}, 2, true]) // '1[object Object],2,true'
log(1 + {}) // '1[object Object]'
log(1 + {count: 2}) // '1[object Object]'
复制代码
分析:
一、undefined 转换成数字时为 NaN
二、null 转换成数字时为 0
三、空数组转换为空字符串
四、非空数组转换为字符串,按照每一个元素来转换成字符串,而后将其结果以逗号的形式拼接起来
五、对象转换成字符串都为 '[object Object]'
复制代码
var log = console.log
log(2 * 2) // 4
log(2 * '2') // 4
log('2' * '2') // 4
log(2 * null) // 0
log(2 * undefined) // NaN
log(2 * [1]) // 2
log(2 * [1, 2]) // NaN
log(2 * {a: 1}) // NaN
log(2 / 2) // 1
log(2 / '2') // 1
log(2 / null) // Infinity
log(2 / undefined) // NaN
log(2 / [1]) // 2
log(2 / [1, 2]) // NaN
log(2 / {a: 1}) // NaN
复制代码
log(2 > 2) // false
log(2 > '1') // true
log(2 > null) // true
log(2 > [1]) // true
log(2 > {a: 1}) // false
log('a' > 2) // false
log('abc' < 'b') // true
// 特殊状况
log(undefined == undefined) // true
log(undefined === undefined) // true
log(null == null) // true
log(null === null) // true
log(undefined == null) // true
log(undefined === null) // false
log(NaN == NaN) // false
log(NaN === NaN) // false
复制代码
log([] == 0) // true [].valueOf().toString = '' Number('') = 0
log(![] == 0) // true ![] = false Number(false) = 0
log([] == []) // false 地址不同
log(![] == []) // true ![] = false Number(false) = 0 [].valueOf().toString = '' Number('') = 0
log(!{} == {}) // false !{} = false Number(false) = 0 {}.valueOf().toString = '[object Object]' Number('[object Object]') = NaN
log({} == {}) // false 地址不同
复制代码
type | Number | String | Boolean |
---|---|---|---|
Number | 原值转换 | 原值转换 | 1: 0-> false -0 -> false 2: 其它数值都为true |
String | 1: 所有由数字组成的字符串,正常转换; 2: 空字符串为0; 3: 其它为NaN |
原值转换 | 1:空字符串为false; 2: 其它为true |
Boolean | false -> 0 true -> 1 | 原值转换 | |
null | 0 | '' | false |
undefined | NaN | 原值转换 | false |
Object | NaN | '[object Object]' | true |
Array | 1:[] 转换为 0([].valueOf().toString() = '' Number('') = 0) 2: 只有一个元素时,就按这个元素的类型转换成 Number([undefined] 除外,转换为 0) 3: 其它状况为 NaN |
将每一个元素转换成字符串以逗号的形式拼接 | true |
function | NaN | 将函数直接变成字符串输出 | true |
Symbol | var b = Symbol('测试类型转换') Number(b) Uncaught TypeError: Cannot convert a Symbol value to a number |
var b = Symbol('测试类型转换') String(b) "Symbol(测试类型转换)" |
true |
【随手笔记,感谢阅读,不对之处请指教,谢谢】