本文深入解析 JavaScript 中的关键表达式与语句。详细阐述 eval() 的作用域特性与字符串执行机制,解析 delete 运算符对属性、数组及内置对象的删除限制。介绍 void 运算符在获取 undefined 及防止页面跳转中的应用,并剖析 Object.create() 的原型创建逻辑。最后通过 && 和 || 的短路行为,讲解安全访问属性及布尔值转换的技巧。
表达式与语句
eval() 的执行机制与作用域
eval()函数仅接受单一参数
若参数非字符串,则直接返回该参数;
若参数为字符串,则将其作为JavaScript代码进行编译:编译失败时抛出语法错误,编译成功时执行代码并返回最后一条语句的值;若无返回值则返回undefined
eval()会复用调用者所在的作用域环境
其接收的字符串参数在作为独立代码片段时,必须具备完整语义,否则编译将失败
delete 运算符的删除规则与限制
delete运算符用于删除对象的自有属性或数组元素,
删除属性后该属性彻底消失;删除数组元素后,数组中会留下一个值为undefined的空位,且数组长度保持不变;
尝试删除不可删除的属性时返回false,若删除成功或操作未产生实际效果(如删除不可配置属性)均返回true
delete无法执行以下操作:
1、内置核心属性及客户端属性不可删除;
2、通过var语句声明的变量不可删除;
3、通过function语句定义的函数及其参数不可删除
4、不可配置的属性无法被删除
void 运算符的应用场景
void运算符会正常执行其操作数,但忽略操作数的返回值并始终返回undefined
void运算符具有如下用途:
* 使用void 0获取undefined比直接使用字面量undefined更为可靠和安全;
* 填充<a>标签的href属性以确保点击时不产生页面跳转;填充<image>标签的src属性以避免向服务器发送无效请求。示例:href='javascript:void(0);'
无论break语句是否带有标签,其控制权均无法跨越函数边界,即无法从函数内部跳转至函数外部
Object.create 与属性访问方式
Object.create( p , [x] )
该方法创建一个以对象p为原型的新对象并返回该对象;可选参数x用于进一步描述对象属性;
var p1 = Object.create(p); // 创建新对象p1,其原型为对象p
即p1的[[Prototype]](原型)属性指向p
P.x与P['x']访问方式的区别:
P.x访问时,仅能固定访问属性名为x的属性;
而P['x']更为灵活,可通过动态修改[]内字符串的值来访问不同属性,例如P['x'+i]
逻辑运算符的短路行为与布尔转换
逻辑与“&&”与逻辑或“||”的短路行为应用
通过&&运算符,确保在读取length属性前,book和book.subtitle均为真值(即对象存在)
var len = book && book.subtitle && book.subtitle.length;
确保x的值为从a~f中第一个为真值的变量,后续真值将被忽略
var x = a || b || c || d || e || f; if( ! buy){...} 当buy为假值时,执行{...}
通过!!x可将任意值转换为等价的布尔值
以上为JavaScript学习笔记中关于表达式与语句的全部内容,希望对大家有所帮助,欢迎继续支持本站~