摘要:语句用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环。在调用函数时的用法表示空值,即该处的值现在为空。或空字符串注意,空数组和空对象对应的布尔值,都是。
个人学习笔记
参考阮一峰的JavaScript教学
2.1-2.2章
变量1
变量的声明和赋值,是分开的两个步骤,上面的代码将它们合在了一起,实际的步骤是下面这样。
var a; a = 1;
如果只是声明变量而没有赋值,则该变量的值是undefined。undefined是一个 JavaScript 关键字,表示“无定义”。
2
如果变量赋值的时候,忘了写var命令,这条语句也是有效的。
var a = 1; // 基本等同 a = 1;
但是,不写var的做法,不利于表达意图,而且容易不知不觉地创建全局变量,所以建议总是使用var命令声明变量。
JavaScript 是一种动态类型语言,也就是说,变量的类型没有限制,变量可以随时更改类型。
var a = 1; a = "hello";变量提升
JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。
console.log(a); var a = 1;
上面代码首先使用console.log方法,在控制台(console)显示变量a的值。这时变量a还没有声明和赋值,所以这是一种错误的做法,但是实际上不会报错。因为存在变量提升,真正运行的是下面的代码。
var a; console.log(a); a = 1;
最后的结果是显示undefined,表示变量a已声明,但还未赋值。
标识符第一个字符,可以是任意 Unicode 字母(包括英文字母和其他语言的字母),以及美元符号($)和下划线(_)。
第二个字符及后面的字符,除了 Unicode 字母、美元符号和下划线,还可以用数字0-9。
arg0 _tmp $elem π
上面都合法
if…else 结构else代码块总是与离自己最近的那个if语句配对。
var m = 1; var n = 2; if (m !== 1) if (n === 2) console.log("hello"); else console.log("world");
上面代码不会有任何输出,else代码块不会得到执行,因为它跟着的是最近的那个if语句,相当于下面这样。
if (m !== 1) { if (n === 2) { console.log("hello"); } else { console.log("world"); } }
如果想让else代码块跟随最上面的那个if语句,就要改变大括号的位置。
if (m !== 1) { if (n === 2) { console.log("hello"); } } else { console.log("world"); } // worldswitch结构
多个if...else连在一起使用的时候,可以转为使用更方便的switch结构。
switch (fruit) { case "banana": // ... break; case "apple": // ... break; default: // ... }
上面代码根据变量fruit的值,选择执行相应的case。如果所有case都不符合,则执行最后的default部分。需要注意的是,每个case代码块内部的break语句不能少,否则会接下去执行下一个case代码块,而不是跳出switch结构。
注意需要注意的是,switch语句后面的表达式,与case语句后面的表示式比较运行结果时,采用的是严格相等运算符(===),而不是相等运算符(==),这意味着比较时不会发生类型转换。
var x = 1; switch (x) { case true: console.log("x 发生类型转换"); default: console.log("x 没有发生类型转换"); } // x 没有发生类型转换
上面代码中,由于变量x没有发生类型转换,所以不会执行case true的情况。这表明,switch语句内部采用的是“严格相等运算符”,详细解释请参考《运算符》一节。
三元运算符 ?:JavaScript还有一个三元运算符(即该运算符需要三个运算子)?:,也可以用于逻辑判断。
(条件) ? 表达式1 : 表达式2
上面代码中,如果“条件”为true,则返回“表达式1”的值,否则返回“表达式2”的值。
var even = (n % 2 === 0) ? true : false;
上面代码中,如果n可以被2整除,则even等于true,否则等于false。它等同于下面的形式。
var even; if (n % 2 === 0) { even = true; } else { even = false; }
这个三元运算符可以被视为if...else...的简写形式,因此可以用于多种场合。
var myVar; console.log( myVar ? "myVar has a value" : "myVar do not has a value" ) // myVar do not has a value
上面代码利用三元运算符,输出相应的提示。
var msg = "数字" + n + "是" + (n % 2 === 0 ? "偶数" : "奇数");
上面代码利用三元运算符,在字符串之中插入不同的值。
break 语句和 continue 语句break语句和continue语句都具有跳转作用,可以让代码不按既有的顺序执行。
break语句用于跳出代码块或循环。
var i = 0; while(i < 100) { console.log("i 当前为:" + i); i++; if (i === 10) break; }
上面代码只会执行10次循环,一旦i等于10,就会跳出循环。
for循环也可以使用break语句跳出循环。
for (var i = 0; i < 5; i++) { console.log(i); if (i === 3) break; } // 0 // 1 // 2 // 3
上面代码执行到i等于3,就会跳出循环。
continue语句用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环。
var i = 0; while (i < 100){ i++; if (i % 2 === 0) continue; console.log("i 当前为:" + i); }
上面代码只有在i为奇数时,才会输出i的值。如果i为偶数,则直接进入下一轮循环。
如果存在多重循环,不带参数的break语句和continue语句都只针对最内层循环。
数据类型数据类型详解
typeof 运算符详解
null与undefined都可以表示“没有”,含义非常相似.将一个变量赋值为undefined或null,老实说,语法效果几乎没区别。
在if语句中,它们都会被自动转为false,相等运算符(==)甚至直接报告两者相等。
if (!undefined) { console.log("undefined is false"); } // undefined is false if (!null) { console.log("null is false"); } // null is false undefined == null // true区别
null转为数字时,自动变成0
Number(null) // 0 5 + null // 5
上面代码中,null转为数字时,自动变成0。
undefined是一个表示”此处无定义”的原始值,转为数值时为NaN。
Number(undefined) // NaN 5 + undefined // NaN
null在调用函数时的用法
null表示空值,即该处的值现在为空。调用函数时,某个参数未设置任何值,这时就可以传入null,表示该参数为空。比如,某个函数接受引擎抛出的错误作为参数,如果运行过程中未出错,那么这个参数就会传入null,表示未发生错误。
undefined表示“未定义”,下面是返回undefined的典型场景
// 变量声明了,但没有赋值 var i; i // undefined // 调用函数时,应该提供的参数没有提供,该参数等于 undefined function f(x) { return x; } f() // undefined // 对象没有赋值的属性 var o = new Object(); o.p // undefined // 函数没有返回值时,默认返回 undefined function f() {} f() // undefinedNaN
NaN-MDN详解
全局属性 NaN 的值表示不是一个数字(Not-A-Number).NaN 是一个全局对象的属性。
NaN 属性的初始值就是 NaN,和Number.NaN的值一样。在现代浏览器中(ES5中), NaN 属性是一个不可配置(non-configurable),不可写(non-writable)的属性。
编码中很少直接使用到 NaN。
通常都是在计算失败时,作为 Math 的某个方法的返回值出现的(例如:Math.sqrt(-1))
或者尝试将一个字符串解析成数字但失败了的时候(例如:parseInt("blabla"))。
判断一个值是否是NaN
等号运算符(== 和 ===) 不能被用来判断一个值是否是 NaN。必须使用 Number.isNaN() 或 isNaN() 函数。
在执行自比较之中:NaN,也只有NaN,比较之中不等于它自己。
NaN === NaN; // false Number.NaN === NaN; // false isNaN(NaN); // true isNaN(Number.NaN); // true function valueIsNaN(v) { return v !== v; } valueIsNaN(1); // false valueIsNaN(NaN); // true valueIsNaN(Number.NaN); // true
自己的测试:
下列运算符会返回布尔值:
两元逻辑运算符: && (And),|| (Or)
前置逻辑运算符: ! (Not)
相等运算符:===,!==,==,!=
比较运算符:>,>=,<,<=
如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true。
undefined null false 0 NaN ""或""(空字符串)
注意,空数组([])和空对象({})对应的布尔值,都是true。
if ([]) { console.log("true"); } // true if ({}) { console.log("true"); } // true
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/94695.html
摘要:一写在前面最近重读高级程序设计,总结下来,查漏补缺。但这种影响是单向的修改命名参数不会改变中对应的值。这是因为对象的长度是由传入的参数个数决定的,不是由定义函数时的命名参数的个数决定的。实际改变会同步,改变也会同步 一、写在前面 最近重读《JavaScript高级程序设计》,总结下来,查漏补缺。 二、JS简介 2.1 JS组成 ECMAscript:以ECMA-262为基础的语言,由...
摘要:虽然会输出,但是这只是存在的一个悠久。在的最初版本中使用的是位系统,为了性能考虑使用低位存储变量的类型信息,开头代表是对象,然而表示为全零,所以将它错误的判断为。 参考来源: JavaScript高级程序设计: book.douban.com/subject/105… 千古壹号: github.com/qianguyihao… 小册前端面试之道: juejin.im/book/5bdc71…...
摘要:十进制最基本的字面量格式八进制第一位必须是。如八进制的十六进制前两位必须是。如十六进制八进制十进制由于函数在处理八进制时与存在分歧,会忽略数字前面的值。通常与方法的返回值相同下一篇入门笔记整理二操作符关注作者吧 下一篇:js入门笔记整理(二)——操作符 给入门的同学整理的笔记,不对的地方欢迎指出~ javascript的组成 首先需要明白的是,一个完整的javascript实现应该由...
摘要:在中,如果函数没有声明返回值,那么会返回。返回是一元运算符,后跟变量的名称,用于获取变量的数据类型,其返回值有个以及。 前言 说好听是说JS灵活, 说不好听就是JS的坑太多, JS类型转换就是一个大坑, JS的类型包括了原始类型的[null, undefined, String ,Number, Boolean],以及对象类型的[function, object]; JavaScrip...
摘要:是最特殊的类型,表示没有意义的数,例如。十六进制数八进制数十进制数十六进制数对于部分情况,和存在分歧。例如,表示希腊字符关于字符串的转换,其实核心就是函数,如果是数字型,还可以添加参数,使之变为二进制八进制十进制十六进制数。 虽然目前已经算是ES6的时代,然是ES5的尾巴仍在众多框架中出现,JS我虽然通过视频等方式学习,曾经做过项目,但是仍对部分细节和原理不了解,通过阅读这本书,希望能...
阅读 1116·2021-11-25 09:43
阅读 1638·2021-09-13 10:25
阅读 2591·2021-09-09 11:38
阅读 3399·2021-09-07 10:14
阅读 1714·2019-08-30 15:52
阅读 641·2019-08-30 15:44
阅读 3572·2019-08-29 13:23
阅读 1973·2019-08-26 13:33