准确判断真实类型应使用Object.prototype.toString.call(),因typeof对null、数组、日期等均返回"object";原始类型共7种,字符串调方法靠临时装箱;==会触发隐式转换,===更安全。

JavaScript 变量和数据类型不需要“背清单”,关键在理解 typeof 的实际行为、== 与 === 的差异,以及哪些类型会隐式转布尔值。
如何准确判断一个值的真实类型?
typeof 对大部分基础类型有效,但对 null 返回 "object",对数组、正则、日期等也统一返回 "object";真正可靠的判断方式是用 Object.prototype.toString.call()。
-
typeof null→"object"(历史 bug,无法修复) -
typeof []→"object",但Object.prototype.toString.call([])→"[object Array]" -
typeof new Date()→"object",而Object.prototype.toString.call(new Date())→"[object Date]" - 现代替代方案可考虑
Array.isArray()、Number.isNaN()等专用判断函数
原始类型(primitive)有哪些?为什么 string 能调方法?
原始类型共 7 种:string、number、boolean、null、undefined、symbol、bigint。它们不可变,且没有自有属性——但访问 "abc".length 或 "abc".toUpperCase() 时,JS 会临时包装成 String 对象(装箱),操作完立刻丢弃。
- 直接赋值原始类型是值拷贝:
let a = 5; let b = a; b = 10;不影响a -
new String("x")创建的是对象,不是原始string,typeof new String("x")是"object" -
Symbol("a") === Symbol("a")为false,每个Symbol都唯一
对象类型中哪些容易混淆?
所有非原始类型的值都是对象(广义),但具体行为差异大:普通 Object、Array、Function、Map、Set、Promise、class 实例等,本质都是 Object 的子类或特殊构造。
十天学会易语言图解教程用图解的方式对易语言的使用方法和操作技巧作了生动、系统的讲解。需要的朋友们可以下载看看吧!全书分十章,分十天讲完。 第一章是介绍易语言的安装,以及运行后的界面。同时介绍一个非常简单的小程序,以帮助用户入门学习。最后介绍编程的输入方法,以及一些初学者会遇到的常见问题。第二章将接触一些具体的问题,如怎样编写一个1+2等于几的程序,并了解变量的概念,变量的有效范围,数据类型等知识。其后,您将跟着本书,编写一个自己的MP3播放器,认识窗口、按钮、编辑框三个常用组件。以认识命令及事件子程序。第
立即学习“Java免费学习笔记(深入)”;
-
function foo() {}的typeof是"function",但它是Object的实例(foo instanceof Object === true) -
[] instanceof Array→true,但[] instanceof Object也 →true -
Promise.resolve().then是函数,但Promise.resolve()本身不是函数,不能直接调用 -
JSON.parse("null")返回原始null,不是对象;JSON.parse("{}")才返回空对象
隐式类型转换最常出问题的场景
发生在 ==、if、&&、||、+ 运算中。记住:只有 6 个 falsy 值(false、0、-0、0n、""、null、undefined),其余全为 truthy——包括 {}、[]、new Boolean(false)。
-
[] == false→true([]先转为空字符串,再转为0,0 == false成立) -
[0] == false→true([0]→"0"→0) -
{} + []→"[object Object]"(对象先toString(),数组先join()) - 用
===替代==,用Boolean(x)或!!x显式转布尔,避免意外
真正难的不是记住类型列表,而是遇到 typeof x === "object" && x !== null 时,立刻想到要继续用 Array.isArray(x) 或 toString.call(x) 细分;还有在写条件判断时,下意识检查是否真需要依赖隐式转换。










