JavaScript 是 弱类型 语言,但并不是没有类型,JavaScript可以识别下面 7 种不同类型的值:
可以使用 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;
global_var2 = 4;
}
}
只声明不赋值,变量的默认值是 undefined
const
关键字可以声明不可变变量,同样为块作用域。对不可变的理解在对象上的理解需要注意
const num = 1;
const obj = {
prop: ‘value‘
};
num = 2; // Uncaught TypeError: Assignment to constant variable.
obj[‘prop‘] = ‘value2‘;
obj = []; // Uncaught TypeError: Assignment to constant variable.
JavaScript中可以引用稍后声明的变量,而不会引发异,这一概念称为变量声明提升(hoisting)
console.log(a); // undefined
var a = 2;
等同于
var a;
console.log(a);
a = 2;
一个函数就是一个可以被外部代码调用(或者函数本身递归调用)的 子程序
function fn(){}
var fn = function(){}
var fn = new Function(arg1, arg2, ... argN, funcBody)
var fn = (param) => {}
function foo() {
return arguments;
}
foo(1, 2, 3); // Arguments[3]
// { "0": 1, "1": 2, "2": 3 }
function foo(...args) {
return args;
}
foo(1, 2, 3); // Array[3]
// [1, 2, 3]
function fn(a, b, ...args){
return args;
}
fn(1, 2, 3, 4, 5); // Array[3]
// [3, 4, 5]
函数的参数可以在定义的时候约定默认值
function fn (a = 2, b = 3) {
return a + b;
}
fn(2, 3); // 5
fn(2); // 5
fn(); // 5
JavaScript 中对象是可变 键控集合
(keyed collections)
var obj = {
prop: ‘value‘,
fn: function(){}
};
var date = new Date();
构造函数和普通函数并没有区别,使用 new
关键字调用就是构造函数,使用构造函数可以 实例化 一个对象
函数的返回值有两种可能
return
返回 return
后表达式的求值return
返回 undefined
function People(name, age) {
this.name = name;
this.age = age;
}
var people = new People(‘Byron‘, 26);
构造函数返回值
前两种情况构造函数返回构造对象的实例,实例化对象正是利用的这个特性
第三种构造函数和普通函数表现一致,返回 return
后表达式的结果
prototype
的对象属性,对象内有一个 constructor
属性,默认指向函数本身__proto__
的属性,属相指向其父类型的 prototype
function Person(name) {
this.name = name;
}
Person.prototype.print = function () {
console.log(this.name);
};
var p1 = new Person(‘Byron‘);
var p2 = new Person(‘Casper‘);
p1.print();
p2.print();
作用域可以通俗的理解
其中我是谁的回答就是 this
马仔就是我的局部变量
普通函数
undefined
global
window
构造函数:对象的实例
对象方法:对象本身
function isNumber(obj) {
return Object.prototype.toString.call(obj) === ‘[object Number]‘;
}
bind
返回一个新函数,函数的作用域为 bind
参数
function fn() {
this.i = 0;
setInterval(function () {
console.log(this.i++);
}.bind(this), 500)
}
fn();
箭头函数是 ES6 提供的新特性,是简写的 函数表达式,拥有词法作用域和 this
值
function fn() {
this.i = 0;
setInterval(() => {
console.log(this.i++);
}, 500)
}
fn();
在 JavaScript 的场景,继承有两个目标,子类需要得到父类的:
function inherits(child, parent) {
var _proptotype = Object.create(parent.prototype);
_proptotype.constructor = child.prototype.constructor;
child.prototype = _proptotype;
}
function People(name, age) {
this.name = name;
this.age = age;
}
People.prototype.getName = function () {
return this.name;
}
function English(name, age, language) {
People.call(this, name, age);
this.language = language;
}
inherits(English, People);
English.prototype.introduce = function () {
console.log(‘Hi, I am ‘ + this.getName());
console.log(‘I speak ‘ + this.language);
}
function Chinese(name, age, language) {
People.call(this, name, age);
this.language = language;
}
inherits(Chinese, People);
Chinese.prototype.introduce = function () {
console.log(‘你好,我是‘ + this.getName());
console.log(‘我说‘ + this.language);
}
var en = new English(‘Byron‘, 26, ‘English‘);
var cn = new Chinese(‘色拉油‘, 27, ‘汉语‘);
en.introduce();