暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

JavaScript基础

小张的栈 2022-01-20
228

“这本被称之为前端红宝书的《JavaScript高级程序设计》共865页,一个假期还要忙别的肯定是肝不完,尽量把ECMAScript语法部分学完吧,还好学过C++,与类C语言有很大相似之处,但是与JAVA是没有半毛钱关系,纯纯是网景公司想蹭热度,但是随着前端(你所能看到的界面,不管是手机或者电脑乃至AR,APP微信小程序等等都叫前端)需求的增多也火了起来,甚至Node.js也可以进行后端开发,虽然对考试和考研没有(如果有幸两年后初试过了,最起码复试的时候还可以说我会点前端),但人这辈子每走的一步都算数。”

  首先,他的(因为发明者是个男的,赋予其生命)变量、函数名和操作符都是区分大小写的,并且不能和自己的关键字重名。

  其次是他的标识符,就是变量、函数、属性或函数参数的名称,可以由一或多个下列字符组成:

  • 第一个字符必须是一个字母、下划线(__)或美元符号($);

  • 其余的字符可以是字母、下划线、美元符号或者数字。

但是ECMAScript的毛病是使用驼峰大小写形式,如:firstSecond,第一个单词首字母小写,第二个开始大写。

  然后注释就和C++一样了,

//单行注释
/* 多行注释 */

  随着ES标准的更新,ES5增加了严格模式的概念(strict mode),ES3的一些不规范的概念在这种模式下会被处理,对于不安全的活动也将抛出错误,要对整个脚本(脚本语言:电脑读一行编译一行的语言)启用严格模式要在脚本开头加上一行:

"use strict";//预处理指令

也可以对指定函数在严格模式下执行,把预处理指令放到函数开头即可:

function doSomething() {
      "use strict";
//函数体
}

  JS的语句以分号结尾,虽然没有分号也有效,但是加分号的好处很多,不再一一列举因为记不住

多条语句则合并到c语言风格的代码块中,以左({)花括号标识开始,右(})花括号标识结束。

  再就是js的保留字了(虽然四级考了两次了但是这些单词还是记得的):break、do、in、typeof、case、else巴拉巴拉一大堆,还有未来的保留字,用的时候避开就好,大都不会冲突。

  天空一声巨响,大佬闪亮登场——变量

  ES的变量是松散型的,意思是变量可以保存任何类型的数据。有三个关键字可以声明变量:var、const和let,var通吃,而const和let只能在ES6以及更晚的版本中使用。

附:桌面端浏览器对ES2015/ES6的支持情况

Chrome:51 版起便可以支持 97% 的 ES6 新特性。

Firefox:53 版起便可以支持 97% 的 ES6 新特性。

Safari:10 版起便可以支持 99% 的 ES6 新特性。

IE:Edge 15可以支持 96% 的 ES6 新特性。Edge 14 可以支持 93% 的 ES6 新特性。(IE7~11 基本不支持 ES6)

我就火狐、微软Edge、谷歌Chrome三款互补使用。

1.var关键字

  • 声明变量

var message;
var message = "hi";//声明变量并初始化
  • 声明作用域

function test(){
  var message = "hi";//局部变量
  }
  test();
  console.log(message);//出错!
  省略var操作符即为全局变量
function test(){
message = "hi";//局部变量
}
test();
  console.log(message);//"hi"但是不推荐这样,严格模式下会报错
  定义多个变量:
  var message = "h1",
      found = false,
      age = 29;//可以不缩进和空格,但是有利于阅读
  • var声明提升(hoist)

function foo() {
console.log(age);
var age = 26;
}
foo(); //undefined
   上面不会报错,是因为ES运行时把他等价于如下代码:
function foo() {
   var age;//所谓的提升就是把所有的变量声明都拉到函数作用域的顶部
console.log(age);
var age = 26;
}
foo(); //undefined

2.let 声明

  与var最明显的区别是let声明的范围是块作用域,var是函数作用域

if (ture){
    var name = 'Matt';
    console.log(name);//Matt
    }
console.log(name); //Matt
再看let
if (ture){
    let name = 'Matt';
console.log(name);//Matt
}
console.log(name); //RefrenceError(参考错误):name没有定义

  其次就是let不允许一个块作用域中出现冗余声明,但是嵌套使用相同的标识符不会报错:

var name;
var name;//允许


var name;
let name;//报错

let name;
var name;//报错

let age;
let age;//SyntaxError(语法错误):标识符age已经声明过了
允许嵌套:
var name = '张祥臻';
console.log(name);//'ZXZ'
if (ture) {
   var name = '陈虹';
   console.log(name);//'陈虹'
}


var name = '张祥臻';
console.log(name);//'ZXZ'
if (ture) {
   let name = '陈虹';
console.log(name);//'陈虹'
}
  • let存在暂时性死区,不会被“提升”,必须先声明

  • 与var关键字不同,使用let在全局作用域中声明的变量不会成为window对象的属性(var声明的变量就会)。

var name = 'Matt';
console.log(winndow.name);//'Matt'


let age = 26;
console.log(window.age);//undefined
  • 条件声明

<script>
//假设脚本不确定页面中是否已经声明过同名变量
//那它可以假设还没有声明过
var name = 'Matt';
//这里没问题,因为可以被作为一个提升声明来处理
//不需要检查之前是否声明过同名变量


let age = 36;
//如果age之前声明过,这里会报错
</script>
  • for循环中的let声明

//迭代变量:一般就叫循环变量,控制循环的次数。
for (var i = 0;i<5;++i){
//循环逻辑
}
console.log(i);//5
改用let之后:
for (let i = 0;i<5;++i){
//循环逻辑
}
console.log(i);//referenceerror:i没有定义
再看
for (var i = 0;i<5;++i){
    setTimeout(() =>console.log(i),0)
}//实际输出5、5、5、5、5、5
原因:在退出循环时,迭代变量保存的是导致循环退出的值:5。
在之后的执行超时逻辑时,所有的i都是同一个变量。
而let:
for (let i = 0;i<5;++i){
setTimeout(() =>console.log(i),0)
}//实际输出0、1、2、3、4

3.const声明

  • const的行为与let基本相同,唯一一个重要的区别是用它声明变量的同时初始化变量,且尝试修改const声明的变量会报错(有点像c++的常变量)

  • const也不允许重复声明,其作用域也是块

  • 但是如果const变量引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制

  • 不可以用const变量声明迭代变量

声明风格:

  1. 不使用var

  2. const优先,let次之

文章转载自小张的栈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论