JavaScript 精粹 基础 进阶(3)语句

r囧r小猫 2022-01-17 14:57 355阅读 0赞

转载请注明出处

原文连接 http://blog.huanghanlian.com/article/5b698ec8b8ea642ea9213f4b

语句

语句、严格模式

JavaScript程序由语句组成,语句遵守特定的语法规则。例如:if语句, while语句, with语句等等。

语句种类

Paste\_Image.png

块 block

块语句常用于组合0 ~ 多个语句。块语句用一对花括号定义。

  1. 语法:
  2. {
  3. 语句1;
  4. 语句2;
  5. ...
  6. 语句n;
  7. }
  8. 比如
  9. {
  10. var str = "hi";
  11. console.log(str);
  12. }//但在实际开发中,很少单独使用块语句
  13. 而是用if...else 或者for while去结合起来使用,
  14. if(true){
  15. //然后{}是一个块,
  16. 然后{里面可以放多条语句}
  17. console.log('hi');
  18. }

声明语句 var

  1. 声明变量语句
  2. var a=1;
  3. 在一个var里也可以声明多个变量
  4. var a=b=1;
  5. 这段语句确实创建了a,b两个变量并且赋值为1,但是其中b实际上是隐式的创建了全局变量,不信看下面的例子
  6. function foo() {
  7. var a = b = 1;
  8. }
  9. foo();
  10. console.log(typeof a); // ‘undefined’
  11. console.log(typeof b); // ‘number
  12. 在一条语句里定义多个变量的方式使用,号分隔
  13. var a=1,b=1;

try catch语句

  1. try { //工作流程首先执行try,catch中的代码
  2. throw "test"; //如果抛出了异常 ,如果没有发生异常catch中的代码就会被忽略掉
  3. } catch (ex) { //会由catch去捕获
  4. console.log(ex); // test //并执行
  5. } finally { //finally 不管有没有异常,finally 都会执行
  6. console.log('finally');
  7. }
  8. javascripttry...catch可以有三种形式
  9. try {
  10. throw "test";
  11. } catch (ex) {
  12. console.log(ex); // test
  13. }
  14. try {
  15. throw "test";
  16. }finally {
  17. console.log('finally');
  18. }
  19. //还有一种就是两者皆有
  20. try {
  21. throw "test";
  22. } catch (ex) {
  23. console.log(ex); // test
  24. } finally {
  25. console.log('finally');
  26. }

例子1

  1. try {
  2. // do sth.
  3. } finally {
  4. console.log('finally');
  5. }
  6. //不管有没有异常最后都有执行finally中的内容

例子2

  1. try {
  2. try {
  3. throw new Error("oops");
  4. }
  5. finally {
  6. console.log("finally");
  7. }
  8. //内部try没有catch,那么他会跳到最近的catch,也就是外层的catch去处理,再跳出block之前需要先执行finally
  9. }
  10. catch (ex) {
  11. console.error("outer", ex.message);
  12. }
  13. //所以这里的执行结果
  14. "finally"
  15. "outer" "oops"

例子3

  1. try {
  2. try {
  3. throw new Error("oops");
  4. }
  5. catch (ex) {
  6. console.error("inner", ex.message);
  7. }
  8. finally {
  9. console.log("finally");
  10. }
  11. }
  12. catch (ex) {
  13. console.error("outer", ex.message);
  14. }//由于内部异常已经处理过,所以不会再跳出到外部处理
  15. 执行结果
  16. "inner" "oops"
  17. "finally"

例子4

  1. try {
  2. try {
  3. throw new Error("oops");
  4. }
  5. catch (ex) {
  6. console.error("inner", ex.message);
  7. throw ex;
  8. }
  9. finally {
  10. console.log("finally");
  11. }
  12. }
  13. catch (ex) {
  14. console.error("outer", ex.message);
  15. }//由于内部catch再次抛出异常就会由外部catch来处理
  16. 执行结果是
  17. "inner" "oops"
  18. "finally"
  19. "outer" "oops"

function语句

函数声明

  1. fd(); // true
  2. function fd() {
  3. // do sth.
  4. return true;
  5. }

函数表达式

  1. fe(); // TypeError
  2. var fe = function() { //定义变量fe,然后把一个匿名函数赋值给fe
  3. // do sth.
  4. };

两者区别在函数声明前面调用函数也是可以的,函数表达式就不可以。

for…in语句

  1. var p;
  2. var obj = {x : 1, y: 2}
  3. for (p in obj) {
  4. }
  1. 顺序不确定
  2. enumerable为false时不会出现
  3. for in对象属性时受原型链影响

switch语句

例子1

  1. var val = 2;
  2. switch(val) {
  3. case 1:
  4. console.log(1);
  5. break;
  6. case 2:
  7. console.log(2); //val==2,会执行这段代码
  8. break; //使用 break 来阻止代码自动地向下一个 case 运行。
  9. default: //使用 default 关键词来规定匹配不存在时做的事情
  10. console.log(0);
  11. break;
  12. }

例子2

  1. var val = 2;
  2. switch(val) {
  3. case 1:
  4. console.log(1);
  5. case 2:
  6. console.log(2);
  7. default:
  8. console.log(0);
  9. }
  10. //输出2,0

例子3

  1. var val = 2;
  2. switch(val) {
  3. case 1:
  4. case 2:
  5. case 3:
  6. console.log(123);
  7. break;
  8. case 4:
  9. case 5:
  10. console.log(45);
  11. break;
  12. default:
  13. console.log(0);
  14. }
  15. //输出123

循环语句while

  1. while (条件)
  2. {
  3. 需要执行的代码
  4. }

例子

  1. var x="",i=0;
  2. while (i<5){
  3. x=x + "该数字为 " + i ;
  4. i++;
  5. }
  6. console.log(x);

do/while 循环

  1. do
  2. {
  3. 需要执行的代码
  4. }
  5. while (条件);

例子

  1. var x="",i=0;
  2. do{
  3. x=x + "该数字为 " + i;
  4. i++;
  5. }
  6. while (i<5)
  7. console.log(x)
  8. //该数字为 0该数字为 1该数字为 2该数字为 3该数字为 4

JavaScript for 循环

  1. cars=["BMW","Volvo","Saab","Ford"];
  2. for (var i=0;i<cars.length;i++){
  3. console.log(cars[i])
  4. }
  5. // BMW
  6. // Volvo
  7. // Saab
  8. // For

不同类型的循环

JavaScript 支持不同类型的循环:

for - 循环代码块一定的次数

for/in - 循环遍历对象的属性

while - 当指定的条件为 true 时循环指定的代码块

do/while - 同样当指定的条件为 true 时循环指定的代码块

with语句

with 语句可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性。要给对象创建新的属性,必须明确地引用该对象

语法格式

  1. with(object instance)
  2. {
  3. //代码块
  4. }

举例

  1. function Lakers() {
  2. this.name = "kobe bryant";
  3. this.age = "28";
  4. this.gender = "boy";
  5. }
  6. var people=new Lakers();
  7. console.log(people)
  8. with(people)
  9. {
  10. var str = "姓名: " + name + "<br>";
  11. str += "年龄:" + age + "<br>";
  12. str += "性别:" + gender;
  13. document.write(str);
  14. }
  15. // 姓名: kobe bryant
  16. // 年龄:28
  17. // 性别:boy
  1. 让JS引擎优化更难
  2. 可读性差
  3. 可被变量定义代替
  4. 严格模式下被禁用

JavaScript 严格模式

严格模式是一种特殊的执行模式,
它修复了部分语言上的不足,提供更强的错误检查,并增强安全性。

  1. function func() {
  2. 'use strict';
  3. }
  4. 'use strict';
  5. function func() {
  6. }

不允许用with

  1. !function() {
  2. with({x : 1}) {
  3. console.log(x);
  4. }
  5. }();
  6. //输出1
  7. !function() {
  8. 'use strict';
  9. with({x : 1}) {
  10. console.log(x);
  11. }
  12. }();
  13. SyntaxError报错

不允许未声明的变量被赋值

  1. !function() {
  2. x = 1; //全局变量
  3. console.log(window.x);
  4. }();
  5. //输出1
  6. !function() {
  7. 'use strict';
  8. x = 1;
  9. console.log(window.x);
  10. }();
  11. //ReferenceError
  12. //在use strict如果没有被声明的变量会报错

arguments变为参数的静态副本

arguments.length 属性返回函数调用过程接收到的参数个数:
arguments属性返回函数调用过程接收到的值

一般模式下

  1. !function(a) {
  2. arguments[0] = 100;//给函数第一个值变成100
  3. console.log(a);//输出的a变成100
  4. }(1);
  5. //输出100
  6. !function(a) {
  7. arguments[0] = 100;
  8. console.log(a);
  9. }();//如果()没有传值arguments长度为空所以更改arguments的值不成立
  10. 输出undefined

严格模式下

  1. !function(a) {
  2. 'use strict';
  3. arguments[0] = 100;
  4. console.log(a);
  5. }(1);
  6. //1
  7. !function(a) {
  8. 'use strict';
  9. arguments[0].x = 100;
  10. console.log(a.x);
  11. }({x:1});
  12. //100

delete参数、函数名报错

一般模式下

  1. !function(a) {
  2. console.log(delete a);
  3. }(1);
  4. //false

‘use strict’;模式下

  1. !function(a) {
  2. 'use strict';
  3. delete a;
  4. }(1);
  5. SyntaxError报错语法错误

delete不可配置的属性报错

一般模式下

  1. !function(a) {
  2. var obj = {};
  3. Object.defineProperty(obj,
  4. 'a', {configurable : false});
  5. console.log(delete obj.a);
  6. }(1);
  7. //false

‘use strict’;模式下

  1. !function(a) {
  2. 'use strict';
  3. var obj = {};
  4. Object.defineProperty(obj,
  5. 'a', {configurable : false});
  6. delete obj.a;
  7. }(1);
  8. //TypeError报错

对象字面量重复属性名报错

一般模式下

  1. !function() {
  2. var obj = {x : 1, x : 2};//对象属性字面量去重复去写属性,这样也是合法的,属性以最后一个为准
  3. console.log(obj.x);
  4. }();
  5. //输出为2

‘use strict’;模式下

  1. !function() {
  2. 'use strict';
  3. var obj = {x : 1, x : 2};
  4. }();
  5. //严格模式下
  6. //SyntaxError报错

禁止八进制字面量

一般模式下

  1. !function() {
  2. console.log(0123);//8进制的值
  3. }();
  4. //输出83

在严格模式下是不允许8进制

  1. !function() {
  2. 'use strict';
  3. console.log(0123);
  4. }();
  5. //SyntaxError报错语法错误

eval, arguments变为关键字,不能作为变量、函数名

一般模式

  1. !function() {
  2. function eval(){}
  3. console.log(eval);
  4. }();
  5. //function eval(){}

严格模式

  1. !function() {
  2. 'use strict';
  3. function eval(){}
  4. }();
  5. //SyntaxError语法错误

eval独立作用域

一般模式

  1. !function() {
  2. eval('var evalVal = 2;'); //在eval函数下定义变量evalVal等于数字2
  3. console.log(typeof evalVal); //evalVal所在的函数内部仍然可以拿到 evalVal
  4. }();
  5. //所以输出number

严格模式

  1. !function() {
  2. 'use strict';
  3. eval('var evalVal = 2;'); //eval代码会在独立作用域执行
  4. console.log(typeof evalVal); //这里拿evalVal是拿不到的
  5. }();
  6. //所以输出undefined

严格模式总结

不允许用with
所有变量必须声明, 赋值给为声明的变量报错,而不是隐式创建全局变量。
eval中的代码不能创建eval所在作用域下的变量、函数。而是为eval单独创建一个作用域,并在eval返回时丢弃。
函数中得特殊对象arguments是静态副本,而不像非严格模式那样,修改arguments或修改参数变量会相互影响。
删除configurable=false的属性时报错,而不是忽略
禁止八进制字面量,如010 (八进制的8)
eval, arguments变为关键字,不可作为变量名、函数名等

一般函数调用时(不是对象的方法调用,也不使用apply/call/bind等修改this)this指向null,而不是全局对象。
若使用apply/call,当传入null或undefined时,this将指向null或undefined,而不是全局对象。
试图修改不可写属性(writable=false),在不可扩展的对象上添加属性时报TypeError,而不是忽略。
arguments.caller, arguments.callee被禁用

严格模式是一种特殊的运行模式,
它修复了部分语言上的不足,提供更强的错误检查,并增强安全性。

转载于:https://blog.51cto.com/14229967/2359690

发表评论

表情:
评论列表 (有 0 条评论,355人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mysql语句

    一、数据类型 MySQL中定义数据字段的类型对数据库的优化是非常重要的。 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)0类型。 1、数

    相关 JavaScript语言精粹

    一、语法 运算符优先级 . [] () 提取属性与调用函数 delete new typeof + - 一元运算符 * / % 乘法、除法、求余 + - 加法/连结、减 ...