- 标识符只是一个名称,用于命名常量,变量,属性,函数和类,并为JavaScript代码中的某些循环提供标签。以字母,下划线或美元符号开头。数字不允许作为第一个字符。
与任何语言一样,Javascript保留某些标识符供语言本身使用。保留字不能作为常规标识符。 - 哪个 if 适合程序,取决于给str赋什么值
if(str !== null){...} // 不为空才会执行 与null比较
if(str){...} // 不为假值或者任何假值(null或未定义)时执行
undefined表示系统级的,意外的或类似错误的值缺失
null表示程序级的,正常的或预期的值缺失
如果需要分配一些值的一个变量或属性,或传递或返回这些值的一个函数,通常使用null
- 将对象(或数组)赋值给变量只会赋值引用,它不会创建对象的新副本。如果要创建对象或数组的新副本,则必须显式复制对象的属性或数组的元素。
let a = ["a", "b", "c"]; // 要复制的数组
let b = []; // 新定义的数组
for(let i = 0; i < a.length; i++){
b[i] = a[i]; // 将a的元素复制到b
}
let c = Array.from(b); // es6中使用数组复制
如果要比较两个不同的对象或数组,则必须比较它们的属性或元素。定义如下函数比较两个数组
function equalArrays(a, b){
if(a === b) return true; // 相同的数组是相等的
if(a.length !== b.length) return false; // 不同大小数组不相等
for(let i = 0; i< a.length; i++){ // 循环遍历所有元素
if(a[i] !== b[i]) return false; // 如果有差异 数组不相等
}
return true; // 否则它们是相等的
}
- 除null或undefined之外的任何值都有 toString() 方法,该方法的结果通常与 String() 函数返回的结果相同。
- 调用表达式 ?.()
function square(x, log){
if(log){
log(x)
}
return x*x
}
// 使用es2020条件调用语法
function square(x, log){
log?.(x);
return x*x;
}
?.() 仅检查左侧的值是否为空或未定义。它不验证该值是否为一个函数。因此,如果传递两个数字给以上示例,它仍然会引发异常。
o.m() // 常规属性访问 常规调用 必须有属性m对象 并且该属性的值必须是函数
o?.m() // 条件属性访问 常规调用 如果o为null或未定义 则表达式的计算结果为未定义 但是如果o有任何其他值 那么必须有一个属性m 其值是一个函数
o.m?.() // 常规属性访问 条件调用 o不能为null或未定义 如果它没有属性m 或者该属性的值为null 则整个表达式的结果未undefined
- 递增(++)
递增运算符的返回值取决于它相对于操作数的位置。在操作数之前使用,被称为预递增运算符,它递增操作数并计算该操作数的递增值。当在操作数之后使用时,它被称为后增量运算符,它增加其操作数,但计算为该操作数的未增加量。
let i = 1, j = ++i; // i 和 j 都是 2
let n = 1, m = n++; // n为2 m为1
减量–运算符与递增++一样。
- 比较运算符
1+2; // 3 相加
'1' + '2'; // '12'
'1' + 2; // '12' 2转换为'2'
11 < 3; // false 数值比较
'11' < '3'; // true 字符串比较
'11' < 3; // flase 数字比较 '11'转换为11
'one' < 3; // false 数值比较 'one'转换为 NaN
总结:
- 表达式是javascript程序的短语
- 任何表达式都可以计算为javascript值
- 除了产生值之外,表达式还可能具有副作用(例如变量赋值)
- 诸如文字,变量引用和属性访问之类的简单表达式可以与运算符组合以生成更大的表达式
- javascript定义里算术,比较,布尔逻辑,赋值和位操作的运算符,以及一些杂项运算符,包括三元条件运算符
- javascript+运算符用于添加数字和链接字符串
- 逻辑运算符&&和||有特殊的短路行为,有时只评估它们的一个论点