JavaScript中,正常是不会报类型错误的,因为会有隐式的类型转换.
例外情况
- 调用一个非函数对象
- 试图选择null
'hello'()
null.toString()
12331()
正常情况
let log = console.log.bind(null)
log(3 + true) // 4
log(2 + 3) // 5
log('17' * 3) // 51
log('hello' + ' world') // hello world
log('2' + 3) // '23'
log(1 + 1 + '2') // '22'
log(1 + '1' + 2) // '112'
// 之所以会出现这个现象是因为+号的优先级,且在数字与字符串相加的时候,会偏向字符串
log('8' >>> 1) // 4
log('8' | '1') // 1
// 隐式转换不仅可以把字符串转换成数字,还会将其转化成32位整数
log(null * 3) // 0
log('333' * 3) // 999
log('dsf' * 3) // NaN
// null在运算的时候会被隐式转化为0. 如果变量中的内容是数字,那会就会隐式转化为数字,否则不会报错,会继续执行,但是得到的结果是NaN
log('the Math Object:' + Math) // the Math Object:[object Math]
// 对象则会调用自身的toString方法,再用结果运算
// 真值转换
// JavaScript中如果要进行逻辑运算,即 if ,|| ,&& .大多数值都会被转化成true.只有 false,0,-0,null,'',undefined,NaN会是假值.
if(false){ // false
console.log('true')
}else{
console.log('false')
}
if(0){ // false
console.log('true')
}else{
console.log('false')
}
if(-0){ // false
console.log('true')
}else{
console.log('false')
}
if(''){ // false
console.log('true')
}else{
console.log('false')
}
if(undefined){ // false
console.log('true')
}else{
console.log('false')
}
if(null){ // false
console.log('true')
}else{
console.log('false')
}
if(NaN){ // false
console.log('true')
}else{
console.log('false')
}
if(32){ // true
console.log('true')
}else{
console.log('false')
}
if(true){ // true
console.log('true')
}else{
console.log('false')
}
if(-435){ // true
console.log('true')
}else{
console.log('false')
}
if('dsf'){ // true
console.log('true')
}else{
console.log('false')
}
if({}){ // true
console.log('true')
}else{
console.log('false')
}
if([]){ // true
console.log('true')
}else{
console.log('false')
}