二 基本语法

教程

https://wangdoc.com/javascript/basic/grammar.html

笔记

1. 语句和表达式的区别

语句主要是为了进行某种操作,一般情况下不需要返回值;表达式是为了得到返回值,一定会有一个返回值。

2. 声明变量未赋值

如果只是声明变量而没有复制,则该变量的值是 "undefined"。undefined 是一个 JavaScript 的关键字,表示 “无定义”。

3. 变量提升、函数提升及 ES6

3.1 变量提升的原理

JS 引擎工作的原理是,先解析代码,获取所有被声明的变量(也就是把文件中所有声明的变量都找出来,然后缓存到内存。这些变量只是声明了但未赋值,变量值自然是 undefined),然后再一行行地运行。这造成的结果就是,所有的变量声明语句,都会被提升到代码的头部,这就是变量提升。

3.2 变量提升的定义

教程:http://www.cnblogs.com/snandy/p/4552078.html
变量提升一个比较严谨的定义:在指定作用域里,从代码顺序上看是变量先使用后声明,但运行时变量的 “可访问性”提升到了当前作用域的顶部,其值为 undefined, 没有“可用性”。

  • 可访问性:访问该变量不会抛异常。
  • 可使用性:调用该变量进行运行,由于其值为 undefined,达不到原来的效果。
console.log(a);
var a = 1;

按照其他语言的经验,第一句应该报错。但是只是输出了 undefined。但是由于 js 是先解释再执行,实际上相当于执行了下面的代码:

// 无论在文件中哪里被声明的变量都被提升到头部了。
var a;
console.log(a);
a = 1;

3.2 函数表达式也会存在变量提升

function test(){
  alert(func);
  var func = function(){};
}
test();

这个程序会显示 alert : undefined。注意这个变量提升主要是用 var 声明变量的缘故。因为 var 声明的变量在 JS 解释阶段都会提升到当前作用域的顶部,所以值是 undefined。所以下面的例子会报错:

function test(){
  alert(func); // undefined.
  func(); // 抛出异常
 var func = func(){};
}

3.3 函数声明的名也会提升到当前作用域顶部

function test(){
  console.log(f1); // 会输出整个函数的定义。
  f1(); // called 
  function f1(){
    console.log("called");
  }
}

3.3 函数声明的名 与 3.2 函数表达式 是不一样的。
函数声明的变量名,是用 function 定义了一个函数,3.2 中的函数表达式是 var 修饰的一个变量。

用 function 定义的函数是更牛的,只要定义了,无论是在定义前使用还是在定义后使用都是 OK 的。这个特性也跟 JS 的解释器会先编译后运行有关。比如 Python 中就不能这么搞:

def a():
    print(b)
    b()
    def b():
        print("bb")

抛出的 error:

UnboundLocalError: local variable 'b' referenced before assignment

静态语言也不能这么搞,比如 go:

func test(){
    a()
    func a(){
        fmt.Println("gggg")
    }
}

我的 ide 直接飘红了。
可见 无论是函数名还是变量的提升,都是拙劣的设计,在写的时候需要避免。

3.4 ES6 中 let / const 的意义

使用 let / const 代替 var 后,变量提升的现象就不存在了。

function test() {
    alert(declaredButNotAssigned1); // 报异常
    alert(declaredButNotAssigned2); // 报异常
    alert(func); // 报异常
  
    let declaredButNotAssigned1;
    let declaredButNotAssigned2 = true;
    let func = function() {};
}
test();

4 标识符

  1. 允许使用 和 _, 在 Python 中是不允许使用 的。

5 注释

由于历史上 JavaScript 可以兼容 HTML 的注释,所以 也被视为合法的单行注释。但是需要注意, --> 只有放在行首才会被当成单行注释,否则会当做正常的运算。

// 自减运算符
a-- 

5 区块

用花括号括起来的语句叫做一个“区块”。
花括号限制不住 var 定义的变量,花括号外面 var 定义的变量依然有效。

{
  var a = 1;
}
a // 1 

但是 es6 的 let,花括号就能管住它。

{
  let a = 2;
}
a // Uncaught ReferenceError: c is not defined

6 条件语句

6.1 switch 结构

  • switch 结构与 Java 相同,需要加 break. Go 则不需要加 break。
  • Java 中的 Condition 必须是 byte / short / int 或 char / String 。JS 和 Go 则没有此限制。
  • Java 中 Case 的值的数据类型必须与 switch 中变量的类型相同。Go 中则要求 case 的数据类型保持一致即可。
switch(condition){
  case val:
  ...
  break;
  default:
  ...
}

6.2 三元运算符

// js & java
condition ? a : b
// python
a if condition else b 
// go 没有三元运算符 

7 条件语句

7.1 do... while 循环

这也是 JS 抄 Java 的地方,无论 while条件是否成立,do 至少执行一次。

do{
 语句 
} while(条件);

我觉得这个do...while 非常别扭,python 中也有类似较劲的 ---------- for ... else ...
for ... else ... 的用法是,如果 for 正常执行完成,则执行一次 else。
我一直觉得这个没什么卵用,但是在 A 公司,他们却这么干

for i in range(n):
  // 重试某个事情,比如重连操作
  if success:
    break
else:
  raise Exeception("重试失败")

7.2 break 和 continue 语句
这两个语句,之前也是知道用法,但是不知道使用场景。
重点在于这两句:

  • break 能中断一个循环,所以当一般和 if 配合使用,达到目的就中断。
  • continue 之后的代码在此次循环中不执行会被跳过,执行下一次代码。
    7.3 标签
label:
  语句

标签用的也比较少,使用场景是配合 continue 和 break, 跳出多重循环。

top:
  for(let i = 0;i<5;i++){
    for(let b=0;b<10;i++){
      if (b * i > 30){
          break top;
        }
  }
}

这样就把最外层的 for 循环给打断了,这样不就节省 CPU 了吗?
continue 的作用也是如此。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,148评论 0 13
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,182评论 0 3
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,474评论 1 45
  • 冰冷的雪花于午夜时分飘起,在浓雾的笼罩下,从点点碎屑逐渐转为片片鹅毛,覆盖在尚未融化的上一场雪上。积雪就这样一...
    Ivanostanovych阅读 551评论 0 0
  • 读《跟苏霍姆林斯基学当老师》感受一:让孩子快乐的学习 阅读了这本书籍之后,我一直在思考:我想做一名什么样的老师?我...
    叶子_简书作者阅读 208评论 0 2