1.JavaScript有哪些类型(红宝书P30)
- 对象转原始类型
- String
- Number
- Undefined
- Boolean
- Null
- Symbol
- BigInt
对象转原始类型
- Object
- Array
- Function
- Error
对象转原始类型原始类型存储的都是值 没有方法 引用类型有
- 原始类型存在在栈中 可直接读取 引用类型存在在堆中 将地址放在变量的栈中
2.typeof instanceof 区别 (红宝书P30)
typeof 1 //'number'
typeof '1' //'string'
typeof {} //'object'
typeof [] //'object'
typeof undefined // 'undefined'
typeof null // 'object'
typeof NaN // 'number'
typeof Symbol() // 'symbol'
typeof console.log // 'function'
// 除了null 原始类型都可以正确返回
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
// 可以判断引用类型 无法判断原始类型
// 全能的类型判断
function _typeof(value) {
return Object.prototype.toString.call(value).toLowerCase().slice(8,-1)
}
3.类型转换
- 布尔类型
// JavaScript falsy值
'' false 0 +0 -0 NaN undefined null
- 对象与原始类型
// Number()
// 布尔值
Number(true) // 1
Number(1) // 1
Number(false) // 0
// 数字
Number(11) // 11
// null
Number(null) // 0
// undefined
Number(undefined) // 0
// 字符串
// 1.整数包含数字
Number('111') // 111
Number('0011') // 11 忽略开头0
Number('-0011') // -11 忽略开头0 保留-号
// 2.浮点数
Number('1.1') // 1.1
Number('-00.11') // -0.11
Number('-00.11') // -0.11
// 3.十六进制 转为对应十进制
Number('0xf') // 15
// 4.空 空格
Number("") // 0
Number(" ") // 0
// 5. 其他情况的字符串
Number("a1") // NaN
// 对象
// 先调用valueOf方法,并按上述规则转换 如果值为NaN 则调用toString方法
Number({}) // NaN
let obj = {
valueOf(){
return 1
}
}
Number(obj) // 1
let obj2 = {
toString(){
return 2
}
}
// obj2的valueOf默认行为是返回对象本身,而不是字符串,所以才会采用toString
Number(obj2) // 2
// String()
// 原始值 没有toString方法 直接返回字面量
String(true) // "true"
String(1) // "1"
String(undefined) // "undefined"
String(NaN) // "NaN"
String(null) // "null"
// 对象
// 调用toString方法
String({}) // "[object Object]"
String([]) // "[object Array]"
4.运算符 (红宝书P56)
一元操作符(只操作一个值的操作符)
var num1 = 2; var num2 = 20; console.log(--num1 + num2) // 21 console.log(num1 + num2) // 21 console.log(num1 + num2--) // 21 console.log(num1 + --num2) // 19
- 前缀 在求值之前改变 有称为副作用
- 后缀 在求值之后改变
其他类型
// String
let a = '1'
a++
console.log(a) // 2
let a = 'z'
a++
console.log(a) // NaN
// Boolean
let a = true
a++
console.log(a) // 2
let a = false
--a
console.log(a) // -1
// 浮点数
let a = 1.01
a--
console.log(a) // 0.010000000000000009
// Object
// 调用valueOf 如果是NaN调用toString
+{} // Number('[object,object]') => NaN
+[] // Number([]) => 先调用valueOf => 返回本身 不是原始值 => 调用toString() "" => Number("") => 0
- 加性操作符
// Number
NaN + 1 // NaN
Infinity + Infinity // Infinity
-Infinity + -Infinity // -Infinity
Infinity + -Infinity // NaN
+0 + +0 // +0
-0 + +0 // +0
-0 + -0 // -0
// String
// 任意操作数是对象、数值、布尔值 则调用toString方法转为字符串
'a' + 'b' // 'ab'
5 + '5' // '55'
1 + {} // '1[object Object]'
{} + {} // 一般浏览器 '[object Object][object Object]'
// 有的浏览器会将第一个{} 解释为空代码块 空代码块 +{} => NaN
// ({} + {}) '[object Object][object Object]'
{} + [] // 浏览器 0 解释为 空代码块 +[] => 0
// node的REPL '[object Object]' + "" => '[object Object]'
[] + {} // String([]) => "" String({}) => "[object Object]"
[] + [] // 先调用valueOf() 返回的是本身 此时结果不是原始值 在调用toString 返回""
[1] + [1,2] // "11,2"
{} + [1] // 1
{} + [1,2,3] // Number([1,2,3]) => NaN
- 关系操作符 > <
// 都是数字1 > 2 // false// 都是字符串 判断对应编码 => Array.prototype.sort()'a' > 'b' // false // 一个为数值 将另一个转换为数值比较1 > '0' // true1 < 'a' // true// 一个为对象 调用对象的valueOf方法 如果没有valueOf 则调用toString比较({} > 1) // false Number({}) => NaN({} < 1) // false({} < 'a') // false String({}) => "[object Object]"// 任一操作数为布尔值 转为数值再比较true > 0 // true true => 1
- 相等操作符 == != ===
// == !== 两个操作数进行类型转换再比较// 任一操作数为布尔值 转为数值再比较true == 1 // truetrue == { a: 1 } // false Number({a:1}) => NaNfalse == { a: 1 } // falsefalse == [] // truetrue == [1] // true true=>1 Number([1])=>1// 一个是字符串 另一个是数值 将字符串转为数值再比较'1' == 1 // true'a' == 97 // false// 一个是对象 另一个不是 则调用对象的valueOf方法取得其原始值 再根据上面规则比较let obj = { valueOf(){ return '2' }}obj == 2 // true// null 与 undefined 相等undefined == null // true// null 与 undefined 不能转换为其他类型进行比较undefined == false // falselet a = ''a == false // true// NaN 不等于任何值NaN == NaN // false// 两个操作数都是对象 判断是否为同一对象let a = {}let b = aa == b // true// 全等 === 不进行类型转换比较
- 布尔操作符 ! && ||
- 指数操作符
- 位操作符
- 乘性操作符 * /
- 条件操作符 三元操作符
- 赋值操作符 += -= …
- 逗号操作符
let a = (1,2,3,4,5)a // 5
相关面试题
// console.log(1+"2") 和 console.log(1-"2") 的打印结果?// 2.var a = 1; a+++a; typeof a+2;// 3var d = a = 3, b = 4console.log(d)// 4var d = (a = 3, b = 4)console.log(d)// 5var a = 1, b = 2, c = 3;var val = typeof a + b || c >0console.log(val)var d = 5;var data = d == 5 && console.log('bb')console.log(data)var data2 = d = 0 || console.log('haha')console.log(data2)var x = !!"Hello" + (!"world", !!"from here!!");console.log(x)// 6console.log(1+1);console.log("2"+"4");console.log(2+"4");console.log(+"4");// 7 var a = typeof typeof 4+4console.log(a)