一、JavaScript是什么
JavaScript是主要用于客户端的脚本语言,ECMAScript是他的标准。
ECMAScript尽管非常重要,但并不是 JavaScript唯一的部分,而且也不是唯一成为标
准的部分。
JavaScript包括了3个部分:
· 核心部分:ECMAScript(里面定义了脚本语言所有的属性,方法和对象!JavaScript,
JScript,ActionScript等都是它的一个实现)
· 文档对象模型:DOM(貌似是操作 XML,HTML所必需的,把标记当成一颗树来操作,
不是 JavaScript特有的)
· 浏览器对象模型:BOM(处理浏览器窗口和框架的,一般的 JavaScript扩展也当作
其中的一部分)
二、变量类型
==与===
对于==的判断
- 并不是那么严谨的判断左右两端是否相等
- 它会优先对比数据的类型是否一致
- 不一致则进行隐式转换,一致则判断值的大小,得出结果
- 继续判断两个类型是否为null与undefined,如果是则返回true
- 接着判断是否为string与number,如果是把string转换为number再对比大小
- 判断其中一方是否为boolean,如果是就转为number再进一步判断
- 判断一方是否为object,另一方为string、number、symbol,如果是则把object转为原始类型再判断
比较情况
-
数组 == 值,(值类型指的是原始类型)会先转成数值再比较,与字符串比较会先转成字符串再比较
-
引用 == 值,会把引用类型转成原始类型再比较
-
值 == 值,直接比较类型再比较值的大小
-
字符串 == 数字,则把字符串转为数值再比较
-
其他类型 == boolean,则把boolean转成数值再进一步比较
-
undefined == null,也会发生隐式转换,且2者可以相互转换,即2者相等,与自身也相等
-
对象 == 非对象,如果非对象为string或number,则返回ToPrimitive(对象) == 非对象,的结果;ToPrimitive方法的参数如果是原始类型则直接返回;如果是对象,则调用valueOf方法,如果是原始值再进行原始类型转换和大小对比;如果不是原始值则调用toString,且结果为原始值则进行原始类型比较,如果不是原始值则抛出错误
// 以下结果都为true console.log([5]==5,['5']==5) console.log({name:'5'}=='[object Object]') console.log('5'==5,true==1,false==0) console.log(undefined==null) console.log([5,6]=='5,6',['5','6']=='5,6')
所谓==比较就是要转换成同类型比较,如果无法转成同类型就报错
如下为判断步骤
思考?如何判断此表达式(注意==!与!==) []==![]
- 基于运算符的优先级此式会先运算![]的结果
- !优先于==,且[]为真值(转成boolean,结果为true的就为真值,包括{};转成false的就为假值),![]结果为false,所以当前表达式转化为 []==false
- 通过之前总结的转换关系,任何类型与boolean类型比较,所以[]==false 转化为 []==0 比较
- 此时变为object与0比较,调用object的转换成原始类型的方法valueOf其结果还是valueOf
- 再调用toString结果为'',再进行string转成number,则[]转成数字类型0
- 表达式进一步转换成0==0,结果为true。
虽然过程复杂,记住判断的思路即可,非对象之间,先类型转换再比大小,对象比较则调用获取原始值方法再进一步比较。
如下为toString与valueOf转换
对于===的判断
-
===属于严格判断,直接判断两者类型是否相同,不同则返回false
-
如果相同再比较大小,不会进行任何隐式转换
-
对于引用类型来说,比较的都是引用内存地址,所以===这种方式的比较,除非两者存储的内存地址相同才相等,反之false
const a=[] const b=a a===b //true
const a=[] const b=[] a===b //false
7大原始类型与Object类型
- Boolean
- Null
- Undefined
- Number
- BigInt
- String
- Symbol
- Object
类型判断
原始类型判断
- 原始类型string、number、undefined、boolean、symbol、bigint都能通过typeof(返回字符串形式)直接判断类型,还有对象类型function也可判断
- 除了null无法通过typeof(为object)直接判断类型(历史遗留),包括对象类型,typeof把null当作对象类型处理,所以typeof无法判断对象类型,typeof也能判断function
非原始类型判断(以及null)
判断数组
- 使用
Array.isArray()
判断数组 - 使用
[] instanceof Array
判断是否在Array的原型链上,即可判断是否为数组 [].constructor === Array
通过其构造函数判断是否为数组- 也可使用
Object.prototype.toString.call([])
判断值是否为'[object Array]'来判断数组
判断对象
Object.prototype.toString.call({})
结果为'[object Object]'则为对象{} instanceof Object
判断是否在Object的原型链上,即可判断是否为对象{}.constructor === Object
通过其构造函数判断是否为对象
判断函数
- 使用
func typeof function
判断func是否为函数 - 使用
func instanceof Function
判断func是否为函数 - 通过
func.constructor === Function
判断是否为函数 - 也可使用
Object.prototype.toString.call(func)
判断值是否为'[object Function]'来判断func
判断null
- 最简单的是通过
null===null
来判断是否为null (!a && typeof (a) != 'undefined' && a != 0)
判断a是否为nullObject.prototype.__proto__===a
判断a是否为原始对象原型的原型即null
判断是否为NaN
isNaN(any)
直接调用此方法判断是否为非数值
一些其他判断
Object.is(a,b)
判断a与b是否完全相等,与===基本相同,不同点在于Object.is判断+0不等于-0
,NaN等于自身
- 一些其他对象类型可以基于原型链判断和构造函数判断
prototypeObj.isPrototypeOf(object)
判断object的原型是否为prototypeObj,不同于instanceof,此方法直接判断原型,而非instanceof 判断的是右边的原型链
一个简单的类型验证函数
function isWho(x) {
// null
if (x === null) return 'null'
const primitive = ['number', 'string', 'undefined',
'symbol', 'bigint', 'boolean', 'function'
]
let type = typeof x
//原始类型以及函数
if (primitive.includes(type)) return type
//对象类型
if (Array.isArray(x)) return 'array'
if (Object.prototype.toString.call(x) === '[object Object]') return 'object'
if (x.hasOwnProperty('constructor')) return x.constructor.name
const proto = Object.getPrototypeOf(x)
if (proto) return proto.constructor.name
// 无法判断
return "can't get this type"
}
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!