Javascript 学习笔记

Javascript

轻量级,解释型或即时编译型的编程语言

基本知识

简介

基本语法

字面量和变量

1
var str = "hello";
  • str是变量, “hello” 是字面量

标识符

变量名, 函数名, 属性名都属于标识符

  • 可以含有字母, 数字, _, $
  • 不能以数字开头
  • 不能是ES中的关键字 (var)
  • 采用驼峰命名法– 首字母小写每个单词开头字母大写, 其余小写
  • 底层保存标识符是才用Unicode

数据类型

  • String
  • Number
  • Boolean
  • Undefined
  • Null
  • Object

String

其中String Number Boolean Null Undefined属于基本数据类型

Object属于引用数据类型

1
2
var str = "hello";
console.log(str);

转义字符 \

Number

所有数值都是Number类型

包括整数和浮点数

可以使用typeof检查数据类型

1
console.log(typeof a);

Number.MAX_VALUE 表示数字最大值

超出最大值 用Infinity表示

如果对string进行运算 返回NaN— not a number

如果用JS进行小数附点运算, 可能不精准

1
var c = 0.1 + 0.2;

所以不要使用JS做精确运算

Boolean

true false

Null

null表示空对象

1
2
var a = null;
console.log(typeof a);

null 值返回 typeof —–Object对象

类型强制转换

将其他类型转String

方法1:

调用toString()方法

1
2
var a =  123;
a.toString();

null 和 undefined 不可以使用toString()

方法2:

用String()函数

1
2
var a = 123;
String(a);

null 和 underfined 可以使用String()函数

其他类型转Number

使用Number()函数
1
2
var a = "123";
a = Number(a);

不是数字或者含非数字返回NaN

boolean转数字

  • true –> 1
  • false –> 0

null –> 0

undefined –> NaN

使用parseInt(), parseFloat() …

1
2
var a = "123px";
a = parseInt(a);

返回123

可以解析到有效整数, 读到第一个非数字就不读了

其他进制的数字

0x表示十六进制

1
var a = 0xff;

0开头表示8进制

1
var a = 070;

0b开头表示二进制, 但不是所有浏览器都支持

1
var a = 0b10;

parseInt()的时候, 有些浏览器解析070数字的时候会当成8进制, 有的当十进制

可以使用第二个参数指定进制

1
parseInt(a,10);

转换boolean

调用Boolean()函数

数字, 除了0和null, 其余都是true

字符串, 除了空串, 都是true

null和undefined都是false


以上还有很多基础内容跳过了

对象

  1. 内建对象
    • ES标准中定义的对象
    • 比如 Math String Number Boolean Function Object….
  2. 宿主对象
    • 运行环境提供的对象, 主要指浏览器提供的对象
    • BOM DOM
  3. 自建对象
    • 由开发人员创建的对象

创建对象

使用new 调用的事构造函数 constructor

1
var obj = new Object();

向obj中添加属性

1
2
3
obj.name = " a name";
obj.gender = "male";
obj.age = "18";

如果读取没有的属性, 不会报错, 返回undefined

删除对象的属性

1
delete obj.name;

属性名不强制遵守标识符规范

特殊属性名需要需要使用 []

1
obj["string"] = 111;

使用情景

1
2
3
4
obj["123"] = 789;
var n = "nihao";

console.log(obj[n]);

属性值可以是任意数据类型

所以也可以嵌套对象

in 运算符

可以检查对象中是否有某个属性

1
console.log("test" in obj);

引用数据类型

1
2
3
4
5
6
7
8
9
var obj = new Object();
obj.name = "孙悟空";

var obj2 = obj;
//修改obj中的name属性
obj.name = "猪八戒";

console.log(obj.name);
console.log(obj.name);

结果是obj和obj2都变了

JS中的变量都是保存到栈内存中的

基本数据类型的值直接在栈内存中存储

引用数据类型(对象) 是在堆内存中的, 每次创建都会在堆中开辟一个新空间, 栈内存中保存的是地址(对象的引用)

1
obj==obj2 //false

对象一样, 但是地址不一样

指定属性创建对象

1
2
3
4
5
6
var obj = {
name: "a name",
age:28,
gender:"male",
"name" = "name" //特殊属性名
}

属性名和属性值是一组组键值对

函数

1
var func = new Function();

typeof 检查函数对象, 返回function

构造函数

将要封装的代码以字符串的形式传递给构造函数

1
2
3
4
5
//constructor
//开发中很少这么传递代码
var func = new Function("console.log('Hello This is a function');");
//call the function
func();

函数声明

语法:

function 函数名([形参1, 形参2, 形参3]){

​ 语句…

}

1
2
3
4
function func(){
console.log("Hello");
}
func();

匿名函数

1
2
3
4
//函数赋值给一个变量
var func2 = function(){
console.log('Hello');
}

实参

1
2
3
function sum(a,b){
console.log(a+b);
}

调用函数时解析器不会检查实参类型;

1
2
sum(123,"abc")
//返回 "123abc"

若如果实参数量少于形参数量, 则没有对应实参的形参是undefined

返回值

1
2
3
function isOu(num){
return num % 2 ==0;
}

实参

对象作为实参

1
2
3
4
5
6
7
8
9
function sayHello(o){
....
}
var obj = {
name: "a name",
age:28,
gender:"male",
}
sayHello(obj);

将函数作为实参

1
2
3
4
5
6
7
8
9
10
function fun(a){
console.log("a = " +a);
}

fun(function(){

alert("hello");

});

1
2
3
4
a = fun3();
a();
//以上代码和fun3()();是一样的意思

立即执行函数

1
2
3
4
5
6
7
8
//后面加(), 定义完直接被调用
(function(){
alert("anoynomous");
})();
//也可以传参
(function(a,b){
alert(a+b);
})(123,456);

对象方法

1
2
3
4
5
6
7
8
var obj = {
name:"啊啊啊",
age:16,
gender:"male",
sayName:function(){
console.log(obj.name);
}
}

取出对象中的属性

枚举

1
2
3
4
5
6
7
8
for(var n in obj){
//obj里面有几个熟悉执行几次
//n代表属性变量名
console.log("属性名:"+n);
//属性值
console.log("属性值"+obj[n]);

}

作用域

全局作用域

  • 直接编写在