JavaScript是实现ECMAScript标准的语言,目前最新的第六版标准于2015年6月发布,简称ES6。目前大多数浏览器都只是实现了ECMAScript标准的第五版。JavaScript的运行需要一个宿主环境,浏览器是最常见的宿主环境,另外还有服务器端环境Node等等。
类型
任何一门编程语言都少不了数据类型,那么在JavaScript中的类型有:
1. Number
2. String
3. Boolean
4. Object (Function, Array, Date, RegExp)
5. Null
6. Undefined
7. Error
8. Symbol
9. Class
虽然说类型有很多,但是只要记住,在JS中只有两种类型:值类型,引用类型。
值类型:number, string, boolean
基本的引用类型:Array, Object, Function
其他的类型都是在ES6中被引入的,包括Class, Symbol 等等。
另外比较特殊的类型就是 null, undefined
于是乎这里引入了第二个问题:typeof 能够得到哪些类型值?
首先,typeof的返回值是字符串
其次,能够得到 string boolean number (三大基本类型) 和 object, function, null, undefined
第三个问题,既然typeof不能用来区分引用类型,那么我该如何来区分引用类型呢?
这时候就需要用到 instanceof 运算符,用来检测一个对象在其原型链上是否具有一个构造函数的prototype属性
更多信息请访问 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof
Number
数字直接量:分为十进制,八进制和十六进制。但是在ES6的严格模式下,禁止使用八进制直接量。
Number对象是经过封装的能够让你处理数字值的对象,Number对象是由Number()构造器创建的。
new Number(value);
JavaScript采用IEEE754标准定义的双精度64位格式(double-precision 64-bit format IEEE754 values),不区分整数值和浮点数值,所有数字都是浮点数值表示,因此小数相加会有精度不准的问题。
内置对象Math处理高级数学函数和常数,内置函数parseInt()将字符串转换为整数,parseFloat()按照十进制格式解析浮点数字符串,运算符+把数字字符串转换为数值,特殊的Number值NaN进行数学运算都是NaN,内置函数isNaN()可以判断一个变量是否为NaN,Infinity, -Infinity分别表示正无穷和负无穷,内置函数isFinity()可以判断一个变量是否为正无穷,负无穷或者NaN
需要详细了解Number可访问 [JavaScript语法学习]全面介绍Number
String
JavaScript中的字符串是一串Unicode字符序列
需要详细了解String可访问 [JavaScript语法学习]全面介绍String
其他类型
null表示空值,必须使用null关键字才能访问。
undefined是未定义类型的对象,表示一个未初始化的值。变量声明但是没有赋值则表示为undefined类型
可以理解为undefined是从null派生出来的一个数据类型,所以undefined == null 为真,但是 undefined === null 为假
布尔值true,false。其他类型的变量转换为布尔值类型的规则: false, 0, "", NaN, null, undefined都转换为false 其他则为true
也可以使用Boolean()函数进行显示转换
最后,提到类型,肯定忘不了类型转换和类型比较。
数据转换涉及到各种类型之间相互转换的规则,而类型比较则是在前者的基础上弄明白==和===这两个比较运算符的区别。
在if语句,+运算符,==,===,!! 以及 逻辑运算 这几种情形下,都会涉及到类型转换。具体的类型转换表如下
[此处的贴图还没有制作好,对不住了]
变量作用域
在ES5中,语句块是没有作用域的,在JS中只有函数才有作用域。 但是从ES6开始,可以使用let, const关键字创建块作用域的变量
函数
函数是JS中的一等公民,如果一个函数没有return语句或者是一个没有值的return语句,则表示返回undefined
如果调用函数时没有提供足够的参数,那么缺少的参数会被undefined替代
函数体中有一个名为arguments的内部对象,是一个类似于数组的对象,但并是array数组,包括了所有传入的参数。
function add(){ var sum = 0; for(var i = 0; i < arguments.length; i++){ sum += arguments[i]; } return sum; } add(2,3,4,5);
function svg(){ var sum = 0; for(var i = 0; i < arguments.length; i++){ sum+=arguments[i]; } return sum/arguments.length; } svg(2,3,4,5);
return语句有个小坑: 前面两个函数执行都没有问题,最后一个返回undefined
function foo(){ return { name: "foo"}; } function foo(){ return { name: "foo" }; } function foo(){ return { name: "foo"}; }
需要详细了解函数类型,可访问 [JavaScript语法学习]全面介绍函数
其他知识点
delete运算符 用于删除一个对象的属性
delete expression
delete object.property
delete object['property']
如果属性是一个不可配置的属性,那么在严格模式下删除会抛出异常,而在非严格模式下返回false. 其他情况下都返回true
只能删除自身属性,而不能删除继承属性
for...in循环只遍历可枚举属性,包含自身和继承的属性
propertyIsEnumerable()返回布尔值,表明指定的属性是否是当前对象可枚举的自身属性
hasOwnProperty() 判断某个对象是否含有指定的自身属性
keys() 返回由给定对象的所有可枚举自身属性的属性名组成的数组
Object.getOwnPropertyNames() 返回由指定对象的所有自身属性的属性名 (包括不可枚举属性) 组成的数组