数据类型:
JavaScript是弱类型语言,并不是没有类型,可以识别下面几种类型的值:
- Boolean 布尔值
- Number 数字 (整数、负数、浮点数、NAN、最大最小值)
- String 字符串
- null 不存在的东西
- undefined 只声明没有赋值
- Symbol
- Object :
– Array
– RegExp
– Date
– Math
– Function
可以使用typeof 判断数据类型,操作符返回一个字符串,但并非返回的所有结果都符合预期
typeof false //"boolean"
typeof .2 //"number"
typeof NaN //"number"
typeof ' ' //"string"
typeof undefined //"undefined"
typeof Symbol() //"symbol"
typeof new Date() //"object"
typeof [] //"object"
typeof alert //"function"
typeof null //"object"
typeof not_defined_var //"undefined"
变量
在应用程序中,使用变量来为值命名。变量的名称:identifiers。
声明
- 使用关键字 var :函数作用域
- 使用关键字let : 块作用域(block scope local variable)
- 直接使用:全局作用域
var global_var = 1; //全局
function fn (){
var fn_var= 2; //函数级作用域
if(fn_var>10){
let block_var = 3; //块级作用域
glocal_var2 = 5; //全局的作用域,但在严格的use strict模式下会报错
}
}
只声明不赋值,变量默认值是undefined
const 关键字可以声明不可变的变量,是块级作用域。是常量。声明后就可以使用,但是不能改变。
const num = 1;
const obj = {
prop:'value'
};
num = 2; //Uncaught TypeError: Assignment to constant variable.
obj['prop'] = 'value2'
obj = [] ; //VM98207:1 Uncaught TypeError: Assignment to constant variable.
变量提升
js中可以引用稍后声明的变量,而 不会引发错误,这就是变量提升
console.log(test) ; //undefined
var test = 1;
//等同于:
var test ;
console.log(test);
test = 1;
函数
一个函数就是一个可以被外部调用或者内部本身递归调用的子程序。
定义函数
- 函数声明
- 函数表达式
- Function 构造函数
- 箭头函数
function fn(){} //左值用的时候是声明
var fun = function(){} //在右边时是表达式
var fn1 = new Function(arg1,arg2,arg3,...argN,funcBody)
var fn2 = (params) => {} //箭头函数
arguments
- 一个包含了传递给当前执行函数参数的类数组的对象
- arguments.length:传给函数的参数的个数
- arguments.caller:调用当前执行函数的函数
- arguments.callee:当前正在执行的函数
function fn(){
return arguments;
}
fn(1,2,6,40); //Arguments(4) [1, 2, 6, 40, callee: ƒ, Symbol(Symbol.iterator): ƒ]
rest 是对arguments的升级,指剩余参数
function foo(...args) {
return args;
}
foo(1,5,6,8,7,8,50); // [1, 5, 6, 8, 7, 8, 50]
function fn(a,b,...args){
return args;
}
fn(2,3,5,6,7,9); //(4) [5, 6, 7, 9]
default 函数的参数在定义的时候约定的默认值
function test (a=1,b=3){
return a+b
}
test(4,6); //10
test(3); //6
test(); // 4
对象
js中对象是可变 键值对
定义对象:
1. 字面量
2. 构造函数
var obj = {
prop:"value",
fs:function(){}
};
var date = new Date();
构造函数
构造函数和普通函数并没有区别,使用new关键字就是构造函数,使用构造函数可以实例化一个对象
函数的返回值有两种可能:
- 显示调用 return 返回return后表达式的求值
- 没有调用 return返回undefined
function Person(name,age){
this.name = name;
this.age = age;
}
var people = new Person('Jam' ,32)
构造函数返回值:
- 没有返回值
- 简单数据类型
- 对象类型
前两个情况构造函数返回构造对象的实例,实例化对象正是利用的这个特性
第三个构造你函数和普通函数表现一只,返回return后表达式的结果
prototype
- 每个函数都有一个prototype的对象属性,对象内有一个constructor属性,默认指向函数本身
- 每个对象都有一个_proto_的属性,属性指向其父类型的prototype