1、变量
javaScript的类型有数字、字符串、布尔值、函数和对象。还有undefined和null,以及数组、日期和正则表达式。
js是弱类型语言。相对于强类型语言java、c、c++等在声明变量时需要指定变量的类型而言。在JS中,我们只需要使用var关键字,而不必指定变量的类型。
2、变量作用域
作用域是指在编写的算法函数中,我们能访问的变量,主要有本地变量和全局变量两种。
在js中要尽量少用全局变量。通常,代码质量可以用全局变量和函数变量来考量。因此,尽可能避免使用全局变量。
3、真值和假值(true/false)
总结:
数值类型 | 转换成布尔值 |
undefined | false |
null | false |
布尔值 | true是true,false是false |
数字 | +0、-0和NaN都是false,其他都是true |
字符串 | 如果字符串是空的(长度是0)就是false,其它都是true |
对象 | true |
4、关于相等操作符(==和===)
(4.1)使用==时,不同类型的值也可以被看作相等。
为什么呢?why?我自己也很困惑,直到我看到了《学习JavaScript数据结构与算法》(第2版)真的讲的很清楚。下面就让我们来揭开这一神秘面纱吧!
类型(x) | 类型(y) | 结果 |
null | undefined | true |
undefined | null | true |
数字 | 字符串 | x == toNumber(y) |
字符串 | 数字 | toNumber(x) == y |
布尔值 | 任何类型 | toNumber(x) == y |
任何类型 | 布尔值 | x == toNumber(y) |
字符串和数字 | 对象 | x == toPrimitive(y) |
对象 | 字符串或数字 | toPrimitive(x) == y |
如果x和有是相同的类型,javaScript会比较它们的值或者对象值。
其中toNumber 和toPrimitive方法都是内部的,会根据下列表格进行评估。
toNumber方法对不同类型返回的结果如下:
值类型 | 结果 |
undefined | NaN |
null | +0 |
布尔值 | 如果是true,返回1,false返回0 |
数字 | 数字对应值 |
字符串 | 将 符串解析成数字。如果字符串中包含字母,返回NaN,如果是由数字字符组成,转换成数字。 |
对象 | Number(toPrimitive(value)) |
toPrimitive()返回值类型如下:
值类型 | 结果 |
对象 | 如果对象的valueof方法的结果是原始值,返回原始值。如果对象的toString方法返回原始值,就返回这个值,其它情况都返回一个错误。 |
几个例子:
为什么会是这样的结果呢?
解析:
- 首先,布尔值会被toNumber方法转成数字 如第一个console中,会得到packet == 1
- 其次,用toNumber转换字符串值,因为字符串值包含有字母,所以会被转成NaN,表达式就变成了NaN == 1,所以结果就是false
- 下面一句console同理 NaN == 0。也会输出false.
(4.2)使用 === 操作符。如果比较的两个值类型不同,比较结果就是false.如果比较的两个值类型相同会根据下列结果判断:
类型(x) | 类型你(y) | 结果 |
数字 | x和y的值相同(但不是NaN) | true |
字符串 | x和y是相同的字符 | true |
布尔值 | x和y都是true或false | true |
对象 | x和y引用同一个对象 | true |
5、条件语句:if ... else
(5.1)可以使用三元操作符替换:
使用三元运算符:
(5.2)对于有多个不同的条件的,可以使用swtich语句。
6、循环
for循环、while()、do...while()
7、函数
在用javaScript编程时,函数很重要。
8、javascript面向对象编程
创建一个普通对象有两种方式:
第一种:var obj = new Object();
第二种:
var obj= {};
在面向对象编程(OOP)中,对象是类的实例。
function Book(title,page,isbn){
this.title=title;
this.page=page;
this.isbn = isbn;
}
//实例化这个类:
var book = new book('title','page','isbn');
类可以包含函数,可以声明和使用函数:
声明方法有:
Book.prototype.printTitle = function(){
console.log(this.title);
};
//使用函数
book.printTitle();
也可以直接在类的定义内声明。
注意!!!!!!!!!!
在原型的例子里,printTitle函数只会创建一次,在所有实例中共享。而在类的定义里声明,则会像前面的例子一样,则每个实例都会创建自己的函数副本。使用原型方法可以节约内存和降低实例化开销。不过原型方法只能声明公共函数和属性,而类定义可以声明只在类的内部访问的私有函数和属性。
9、ECMAScript
ECMAScript 和 JavaScript有什么关系和异同?
答:ECMAScript是一种脚本语言规范。JavaScript是这个规范的一个实现。JavaScript是一种主要在浏览器中运行的语言,每个浏览器都可以实现自己版本的JS功能。而这个具体实现是基于ECMAScript的。
(9.1):使用Babel.js (https://babeljs.io)是一个JavaScript转译器,也称为源代码编译器。它能够将使用了es6和es7语言特性你的JavaScript代码转换成只使用广泛支持的es5特性的等价代码。
10、es6中的几个知识点:
(1)使用let 代替var 声明变量
可以防止同一个代码块中具有相同的变量声明。
同时let可以限定变量的作用域。这样有利于防止全局变量污染。
(2)常量
es6中引入了const关键字。使用const定义的变量是只读的,也就是常量。
(3)模板字面量
: 模板字面量用一对 ` 包裹。要插入变量的值只要把变量放在 ${} 就可以了 。
模板字面量也可以用于多行字符串,再也不需要用\n了。只需要按下键盘enter就可以换一行。
(4)箭头函数
es6的箭头函数极大地简化了函数的语法。
(5)函数的参数默认值
在es6中我们可以默认设置参数的默认值。
(6)声明展开和剩余参数(...)
在es5中使用apply()函数把数组转化为参数。而在es6中则是通过展开操作符 ...
如:
var param = [3,4,5];
console.log(sum(...params))
在函数中,展开操作符(...)也可以代替arguments,当作剩余参数使用。
(7)数组解构
es6中引入了数组解构的概念,可以用来一次初始化多个变量。
var[x,y] = ['a','b'];
也可用来进行值的交换。
(8)类
(8.1)继承:除了新的声明类的方式,类的继承也有简化的语法。
可以使用extends关键字来扩展一个类并继承它的行为。在构造函数中也可以通过super关键字引用父类的构造函数。
(8.2)使用属性存取器
使用新的类语法也可以为属性创建存取器函数。