1.基本概念
定义: 运行在客户端的一种脚本语言,不需要进行编译。
作用:
- 表单的动态检测
- 服务器的开发(node.js)
- 桌面程序(electron)
- App (cordova)
- 控制硬件 — 物联网(Ruff)
- 游戏开发 — (cocos2d-js)
执行:
- 渲染引擎:用来解析HTML与CSS,俗称内核,比如chrome的blink,和老版本的webkit。
- JS引擎: 又称js解析器,用来读取网页中的JavaScript代码,对其处理后运行,比如chrome的V8。
组成:
- ECMAScript:JavaScript语法
- DOM:页面文档对象模型
- BOM:浏览器对象模型
2.变量声明(var let const)
var变量:所有版本都可以使用。
- 声明作用域
var temp = "abc"; //1.全局变量
function fn(){
var temp2 = "abc"; //2.局部变量
temp3 = "abc"; //3.去掉var操作符,自动升级为全局变量(不推荐使用)
}
fn();
console.log(temp); //正常输出
console.log(temp2); //报错
console.log(temp3); //正常输出
- 声明提升
使用var声明的变量会自动提升道作用域的顶部,并且还可以重复声明同一个变量
function fun(){
console.log(num) //undefined
var num = '25';
}
fun();
//fun 等价于 fun2
function fun2(){
var num ;
console.log(num)
num = '25';
}
fun2();
let变量:只能在ECMAScript6及以后的版本使用。
作用和var差不多,但是最主要的区别就是let声明范围的是块作用域,而var声明的的范围是函数作用域。在同一个块作用域中,只能声明一次。
let name ='five';
let name ='five';// SyntaxError: Identifier 'name' has already been declared
if (true){
var num = '123';
console.log(num) //123
let count = '456';
console.log(count); //456
}
console.log(num); //123
console.log(count); // ReferenceError: count is not defined
- 其他区别:
1.暂时性死区:let申明的变量不会在作用域中被提升。
2.全局声明:let在全局作用域中声明的变量不会成为window对象的属性,(var声明的对象会)
var name = 'five';
console.log(window.name); //five
let sex = 'nan';
console.log(window.sex); //undefined
3.条件声明:在if条件下,在使用var声明变量时,由于声明会被提升,js引擎会将多余的声明提升到作用域的顶端合并成为一个声明,let的作用域是块,所以不会检查前面是否已经使用let声明过同名变量,同时也就不可能再没有声明的情况下声明它。
4.for循环中的let声明:在使用let申明迭代变量的时候,js引擎会给每个迭代循环声明一个新的迭代变量,每个setTimeout引用的都是不同的变量实例。
for (var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i); //5 5 5 5 5
}, 0)
}
for (let j = 0; j < 5; j++) {
setTimeout(() => {
console.log(j); // 0 1 2 3 4
}, 0)
}
const常量:只能在ECMAScript6及以后的版本使用。
const与let基本相同,区别就是在于:在声明变量的是时候必须初始化值,且尝试修改const声明的变量会导致错误。(对象除外,即使用const声明的对象,可以修改这个对象内部的属性。)
//不允许给常量赋值
const age = 15;
age = 22; //TypeError: Assignment to constant variable.
//不允许重复赋值
const name = 'a';
const name = 'b'; //SyntaxError: Identifier 'name' has already been declared
//声明的作用域是块
const data = 'c';
if (true) {
const data = 'd';
}
console.log(data); //c;
总结:1.不使用var,由let或者const代替,2.优先使用const,let次之。
3.数据类型(基本数据类型:Undefined,Null,Boolean,Number,String,Symbol(符号,ECMAScript6新增)复杂数据类型:Object)
-
typeof操作符:是一个操作符,而不是函数,所以可以不需要参数(但是可以使用)。
1.“undefined” 表示值未定义
2.“boolean” 表示值为布尔值
3.“string” 表示值为字符串
4.“object” 表示值为对象(而不是函数)或者null
5.“function” 表示值为函数
6.“symbol” 表示值为符号
例子:
let message = 'hello word';
console.log(typeof message); //string
console.log(typeof (message)); //string
console.log(typeof 95); //number
let car = null;
console.log(typeof car); //object
- Null类型:只有一个值,特殊值null,null表示一个空对象的指针,也就解释了给typeof 传一个null会返回“object”的原因。
- Boolean类型:可以将其他所有的数据类型转换成为Boolean值,通过调用特定的函数Boolean(),来实现。
数量类型 转换成为true的值 转换成为false的值
Boolean true false
String 非空字符串 “”(空字符串)
Number 非零值 0、NAN
Object 任意对象 null
Undefined N/A(不存在) undefined
-
NAN:特殊数值,表示本来要返回数值的操作失败了(而不是抛出错误)
1.数值转换- Number():转型函数,可用于任何数据类型。
- parseInt();通常需要获取整数的时候可以使用该函数。字符串最前的空格会被忽略掉,冲第一个非空格字符串开始转换,如果第一个字符不是数值字符、加号或者减号,parseInt()立即返回NaN。如果中间是字符串,就会自动省略字符后面所有的(包含字符串)。第二个参数最好不省略,直接写10,代表十进制。
let num4 = Number(''); // 0
let num5 = Number('125ad2');// NaN
let num1 = parseInt('125d22',10); //125--注意指定进制
let num2 = parseInt('',10); //NaN
let num3 = parseInt('515.52.2',10); //515
- Symbal符号:符号是原始值,且符号实例是唯一,不可变的。符号的用途是确保对象使用唯一标识符,不会发生属性冲突的危险。
- == 与 ===:相等(==),值相等即为true;全等(===),不仅值要相等,对象类型也要一致。
let flag = '55' == 55; //true
let flag2 = '55' === 55; //false 数据类型不相同