百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

JavaScript 的25个高级特性_js特性有哪些

myzbx 2025-09-03 05:24 9 浏览

很多前端同学写 JavaScript 写久了,会觉得语言特性都已经用得差不多了:函数、数组、对象、Promise……没什么新鲜感。

但其实,JavaScript 还有不少被低估的语法和技巧。
它们可能是规范里的冷门细节,可能是 ES6+ 新增的语法糖,也可能是一些看似奇怪但非常实用的特性。

本文整理了 25 个实用又有点“冷门”的 JavaScript 高级特性,每一个都配有示例和讲解。
如果你想在代码中写出更优雅的实现,或者在面试时展示更深的理解,这篇内容绝对值得收藏。

1 、 循环和块语句的标签(Labelled Statements)

JavaScript 允许给循环和代码块加上“标签”,然后可以结合 break 和 continue 精确控制流程

outerLoop: for (let i = 0; i < 5; i++) { // 定义外层循环,并打上标签 outerLoop
    innerLoop: for (let j = 0; j < 5; j++) { // 定义内层循环,并打上标签 innerLoop
        if (i === 2 && j === 2) break outerLoop; // 当 i 和 j 都等于 2 时,直接跳出外层循环
        console.log(`i=${i}, j=${j}`); // 打印当前循环的 i 和 j 值
    }
}

2 、 逗号运算符(Comma Operator)

逗号运算符可以让多个表达式依次执行,并返回最后一个表达式的结果。

let a = (1, 2, 3); // 执行 1、2、3,最终结果为 3,所以 a = 3

3 、 超越字符串拼接的标签模板字面量(Tagged Template Literals)

标签模板不仅能拼接字符串,还可以用于创建 DSL(领域专用语言)、转义用户输入、防止 XSS 或实现国际化。

function htmlEscape(strings, ...values) { // 定义一个标签函数,接收字符串数组和变量值
    // 示例实现(可以在此处理 values,防止恶意注入)
}

4 、 代码块中的函数声明(Function Declarations Inside Blocks)

虽然不推荐,但 JavaScript 允许在代码块里声明函数。在严格模式和非严格模式下,行为可能不同。

if (true) {
    function test() { return "Yes"; } // 在 if 分支里定义函数
} else {
    function test() { return "No"; } // 在 else 分支里定义函数
}
test(); // 在不同环境下结果可能不同,有的环境返回 "Yes",有的报错

5 、 void 运算符

void 运算符会执行一个表达式,然后返回 undefined,常用于避免链接跳转。

void (0); // 执行 0,但结果始终是 undefined

6 、 用位运算符加速数学运算(Bitwise Operators for Quick Math)

位运算符(如 | 和 &)能快速进行一些数学操作,代价是可读性降低。

let floor = 5.95 | 0; // 使用按位或运算符去掉小数部分,相当于 Math.floor(5.95),结果为 5

7、 with 语句操作对象(with Statement)

with 可以把对象添加到作用域链中,让代码更简短。但会降低可读性和性能,因此不推荐。

with(document.getElementById("myDiv").style) { // 将 myDiv.style 属性加入作用域链
    background = "black"; // 相当于设置 myDiv.style.background = "black"
    color = "white"; // 相当于设置 myDiv.style.color = "white"
}

8 、 自动分号插入(ASI)

JavaScript 会尝试自动补全缺失的分号,但依赖它可能会导致意料之外的错误。

let x = 1 // 这里少了分号,JS 会尝试补齐
let y = 2 // 这里同样
[x, y] = [y, x] // 如果缺少分号,可能会被解析为函数调用而出错

9 、 in 运算符检查属性存在

in 运算符可以判断对象是否拥有某个属性,而无需读取属性值。

"toString" in {}; // true,因为所有对象都继承自 Object.prototype,它有 toString 方法

10、 instanceof vs typeof

instanceof 用于检查对象的原型链,typeof 返回操作数的类型字符串。

function Person() {} // 定义构造函数
let person = new Person(); // 创建实例
console.log(person instanceof Person); // true,person 的原型链包含 Person.prototype
console.log(typeof person); // "object",因为 person 是对象

11 、 ES6 中的块级函数(Block-Level Functions)

在 ES6 中,函数也可以像 let、const 一样成为块级作用域。

{
    function test() {
        return "block scoped"; // 在块中定义函数
    }
}
console.log(typeof test); // 在非严格模式下可能是 "function",严格模式下可能是 "undefined"

12 、 debugger 语句

使用 debugger 可以在开发工具打开时中断代码执行,方便调试。

function problematicFunction() {
    debugger; // 执行到这里会自动暂停,开发者可在控制台调试
}

13、 eval() 动态执行代码

eval 可以把字符串当作 JavaScript 代码执行,但有严重的性能和安全隐患。

eval("let a = 1; console.log(a);"); // 执行字符串代码,输出 1

14、 非标准的proto 属性

__proto__ 可以设置对象的原型,但它是非标准的。推荐使用 Object.getPrototypeOf 和 Object.setPrototypeOf。

let obj = {}; // 定义一个对象
obj.__proto__ = Array.prototype; // 修改原型为数组原型(不推荐)

15、 document.write() 直接写入页面

document.write() 可以直接往页面写内容,但可能影响加载性能和安全。

document.write("<h1>Hello World!</h1>"); // 直接往页面写入 h1 标签

16 、链式赋值(Chained Assignment)

JavaScript 支持链式赋值,可以一次性给多个变量赋同一个值。

let a, b, c; // 定义变量
a = b = c = 5; // 三个变量都被赋值为 5

17 、in 运算符检测属性是否存在

再次强调,in 可以检测对象属性是否存在,而不必读取值。

const car = {
    make: 'Toyota', // 定义属性 make
    model: 'Corolla' // 定义属性 model
};
console.log('make' in car); // true,因为 car 对象有 make 属性

18、 对象属性简写(Object Property Shorthand)

当变量名和对象属性名相同时,可以直接写简写形式。

const name = 'Alice'; // 定义变量 name
const age = 25; // 定义变量 age
const person = { name, age }; // 简写形式,相当于 { name: name, age: age }

19 、 默认参数值与解构结合

函数参数可以结合解构和默认值,让函数定义更灵活。

function createPerson({ name = '匿名', age = 0 } = {}) { // 参数解构,提供默认值
   console.log(`姓名: ${name}, 年龄: ${age}`); // 打印参数
}
createPerson({ name: 'Alice' }); // 姓名: Alice, 年龄: 0
createPerson(); // 姓名: 匿名, 年龄: 0

20 、使用 Array.fill() 初始化数组

fill() 方法可以快速初始化数组。

const initialArray = new Array(5).fill(0); // 创建一个长度为 5 的数组,并用 0 填充,结果 [0,0,0,0,0]

21 、 Array.includes() 判断元素是否存在

比 indexOf() 更直观的方法。

const fruits = ['apple', 'banana', 'mango']; // 定义数组
console.log(fruits.includes('banana')); // true,数组中包含 banana

22、 解构时使用别名(Destructuring Aliases)

在对象解构时,可以为属性赋予新的变量名。

const obj = { x: 1, y: 2 }; // 定义对象
const { x: newX, y: newY } = obj; // 使用别名,x → newX,y → newY
console.log(newX); // 1

23 、 空值合并运算符(Nullish Coalescing Operator)

?? 仅在值为 null 或 undefined 时使用默认值,而不会误判 0 或 false。

const count = 0; // count 值为 0
console.log(count ?? 10); // 输出 0,因为 count 不是 null 或 undefined

24 、 动态函数名(Dynamic Function Names)

通过计算属性名,可以定义动态函数。

const dynamicName = 'func'; // 定义动态方法名
const obj = {
    [dynamicName]() { // 使用计算属性名定义方法
        return '动态函数名!';
    }
};
console.log(obj.func()); // 调用 obj.func(),输出 "动态函数名!"

25、 类的私有字段(Private Fields in Classes)

使用 # 前缀可以定义私有属性,外部无法直接访问。

class Counter {
    #count = 0; // 定义私有属性 #count,外部不可访问

    increment() {
        this.#count++; // 内部方法可以访问私有属性
    }

    getCount() {
        return this.#count; // 提供访问方法
    }
}

相关推荐

前端工程师养成计划 专区_前端工程师技能要求

前端工程师必修课本课程从最基本的概念开始讲起,步步深入,带领大家学习HTML、CSS样式基础知识,了解各种常用标签的意义以及基本用法,后半部分讲解CSS样式代码添加,为后面的案例课程打下基础。本课程让...

深入浅出虚拟 DOM 和 Diff 算法,及 Vue2 与 Vue3 中的区别

因为Diff算法,计算的就是虚拟DOM的差异,所以先铺垫一点点虚拟DOM,了解一下其结构,再来一层层揭开Diff算法的面纱,深入浅出,助你彻底弄懂Diff算法原理认识虚拟DOM虚拟...

css 布局简述_css布局的几种方式

本篇简单介绍了css布局体系。包括Flowlayout、display、floats、positionFlowlayout(NormalFlow)CSSFormattingContext...

dart系列之:HTML的专属领域,除了javascript之外,dart也可以

简介虽然dart可以同时用作客户端和服务器端,但是基本上dart还是用做flutter开发的基本语言而使用的。除了andorid和ios之外,web就是最常见和通用的平台了,dart也提供了对HTML...

原来隐藏一个DOM元素可以有这么多种方式,最后一种你肯定不知道

我们在日常编码的时候,隐藏一个dom元素有很多种方式,今天我们来盘点一下隐藏dom元素有哪些方式,最后一种,你绝对没有用过。display:none作为经常用来隐藏元素的css属性,di...

JavaScript精通到深入_javascript进阶书籍推荐

前几天教大家从入门到精通,当然仅靠那一篇文章是不足以带领大家精通JavaScript的,今天给大家带来第二讲!BOM和DOM简介BOM,BrowserObjectModel,浏览器对象模型。BO...

巧克力:从一朵花开始的华丽变身_巧克力花束教程视频

世界上几乎所有的巧克力产品,都出自四五家大公司大型工厂里的流水线。然而,“手工制作巧克力”正在成为一种潮流,吸引着越来越多的人沉醉其中。这些娇嫩的花朵,是你吃过的每一块巧克力的开始。可可花直接生长在...

browser-use:AI 驱动的浏览器自动化神器——DOM识别与交互详解

browser-use可以识别网页中可交互DOM内容,并能与之进行交互。本文将详细介绍browser-use实现这一核心功能的技术细节。一、可交互元素识别browser-use是通过DOMS...

HTML DOM Progress 对象_html中的对象

Progress对象Progress对象是HTML5新增的。Progress对象表示一个HTML<progress>元素。<progress>元素表示任务...

HTML DOM Script 对象_html document对象

Script对象Script对象表示一个HTML<script>元素。访问Script对象您可以使用getElementById()来访问<scrip...

虚拟DOM真的比操作原生DOM快吗?前端大神提供4个参考观点!收藏

尤雨溪:https://www.zhihu.com/question/31809713/answer/53544875VirtualDOM真的比操作原生DOM快吗?1.原生DOM操作v...

前沿|一种新的植入药物或可将HIV的预防时间持续一年

国外已经批准了一种叫做Truvada(中文名:特鲁瓦达)的药物用于HIV感染的暴露前预防。但是由于该药需要每天服用,因此有些人可能无法坚持,从而使得该药的预防效果降低。最近一项新的研究或许可以改变这种...

轻量级埋点sdk搭建,便捷更全面_埋点工具

引言借助埋点监控sdk,我们可以统计用户的点击,页面pv、uv,脚本错误、dom上报等关键信息等。一:项目初始化1.技术栈Tsrollup打包工具2.搭建项目npminit-ytsc--in...

China&#39;s Humanoid Robotics Race Heats Up as Tesla&#39;s Optimus Hits a Wall

TMTPOST--Tesla'sonce-hypedhumanoidrobotproject,Optimus,hashitasnag.Partsprocurementhas...

单机训练速度提升640倍!独家解读快手商业广告模型GPU训练平台Persia

【导读】:近期,快手宣布将在2020年春节前实现3亿DAU,快手商业化营收步伐也随之加速。快手从2018年“商业化元年”开始推行个性化的广告推荐。截止5月底,快手DAU已经突破2亿。随着用户和使用时长...