JavaScript类型检测需组合使用:typeof对null返回"object"是历史bug,应配合value===null判断;精确识别内置对象须用Object.prototype.toString.call()和Array.isArray();隐式转换易出错,推荐严格相等和显式转换。
JavaScript 有 7 种原始(primitive)类型和 1 种引用(object)类型,但实际运行中类型检查和转换行为常让人困惑——关键不在“有哪些”,而在“
、
、
各自能信多少”。
原始类型只有 7 个,
和
的
返回值是历史包袱
对大部分原始类型返回预期结果,但有两个经典例外:
返回
(V8 引擎早期 bug,沿用至今)
返回
(正确)
返回
(ES6 新增,正常)
(BigInt)返回
(ES2020 起支持)
所以不能单靠
判定是否为对象或
。遇到
,必须再用
单独排除。
和
是最可靠的类型探测组合
当需要精确区分
、
、
、
等内置对象时,
在跨 iframe 或不同全局环境会失效;
统一返回
。
立即学习
“
Java免费学习笔记(深入)
”;
此时应优先使用:
配合
(专用于数组,更语义化且性能略优)即可覆盖绝大多数场景。
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
隐式转换
的坑集中在
、
、
和
条件判断
JavaScript 在特定操作符下会自动调用
或
,导致反直觉结果:
→
(
转为
)
→
(空字符串转为
,再与
比较)
→
(右边先转布尔
,再取反为
;左边转为空字符串
,再转为
;
成立)
→
(两个数组先
得
和
,再字符串拼接)
建议:永远用
替代
;对用户输入或外部数据做类型校验时,显式调用
、
、
,而非依赖隐式转换。
显式转换要分清目的:
、
、
行为完全不同
三者都可用于字符串转数字,但规则差异极大:
→
(前后空格被忽略,全字符串必须可解析)
→
(任何非纯数字字符都会失败)
→
(从左开始解析,遇到非法字符即停)
→
(支持进制前缀,
表示十六进制)
→
(支持科学计数法,只解析开头浮点部分)
若目标是“安全提取数字”,优先用
;若需兼容带单位或前缀的字符串,才考虑
或
,并始终检查返回值是否为
(注意:
,要用
或
)。
类型检查真正难的不是记住所有方法,而是意识到「JS 类型系统本质是运行时、弱且动态的」——没有编译期类型约束,所有检查都是补救。最容易被忽略的是跨环境对象识别(比如 iframe 中的数组)和
的双重身份(原始值却返回
)。写工具函数时,别省那几行
或
。
typeofinstanceofObject.prototype.toString.call()nullundefinedtypeoftypeoftypeof null"object"typeof undefined"undefined"typeof Symbol("a")"symbol"typeof 42n"bigint"typeofnull"object"value === nullArray.isArray()Object.prototype.toString.call()ArrayDateRegExpMapinstanceoftypeof"object"Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call(new Date()) // "[object Date]"
Object.prototype.toString.call(/a/g) // "[object RegExp]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"Array.isArray()==+!iftoString()valueOf()0 == falsetruefalse0"" == falsetrue0false[] == ![]truetruefalse""00 == false[1] + [2]"12"toString()"1""2"=====Number()String()Boolean()Number()parseInt()parseFloat()Number(" 42 ")42Number("42px")NaNparseInt("42px")42parseInt("0x1A")260xparseFloat("3.14e2")314Number()parseInt()parseFloat()NaNNaN !== NaNisNaN()Number.isNaN()null"object"value === nullObject.prototype.toString.call(value)