JavaScript是动态类型语言:变量无类型,类型属于值且可随时改变;运行时确定类型并检查错误;支持隐式转换但易出错;对象和函数行为高度灵活。

JavaScript 的动态类型特性,核心就一句话:变量本身没有类型,类型只属于值,而且这个值随时可以变。
变量不绑定类型,值决定一切
声明变量时完全不用指定类型。let、const、var 后面跟的只是一个“容器”,它不承诺装什么——装数字就是 number,装字符串就是 string,装数组就是 object,装函数就是 function:
-
let x = 42;→ 此刻typeof x是"number" -
x = "hello";→ 立刻变成"string" -
x = null;→ 变成"object"(这是历史遗留 bug,但行为固定) -
typeof检查的永远是当前值的类型,不是变量的“身份”
运行时才定型,错误也发生在运行时
JavaScript 不做编译期类型检查。代码直接交给引擎执行,类型相关的问题只有真正用到那一刻才会暴露:
-
let count = 10;看起来没问题 - 但如果后面写
count.toUpperCase(),运行时立刻报TypeError -
"5" + 2得"52","5" - 2却得3—— 运算符会当场触发隐式转换,规则由引擎按需判断 - 没有 TypeScript 的项目里,这类问题只能靠测试、调试或用户反馈来发现
隐式转换常带来意外,但不是“弱类型”的锅
很多人说 JS “弱类型”,其实更准确的说法是:动态类型 + 隐式强制转换。转换逻辑明确但反直觉:
立即学习“Java免费学习笔记(深入)”;
-
0 == false是true,因为==会先转类型再比较;而0 === false是false -
Boolean([])和Boolean({})都是true,但Boolean(null)是false - 做数学运算前,建议用
Number(x)或parseInt(x, 10)显式转换,别依赖+"123"或x - 0这类写法
动态性不止于变量,还贯穿对象和函数
类型灵活性延伸到语言行为层面,让 JS 更贴近运行时需求:
- 对象可随时增删属性:
obj.name = "Alice"; delete obj.name; - 函数参数不限类型也不限数量:
function log(a) { console.log(a) }可传字符串、数组、undefined,甚至另一个函数 - 同一个函数调用,输入不同类型可能触发完全不同逻辑,比如
Array.from()对类数组和可迭代对象的处理路径就不同


















