前端学习之路-JavaScript初级

117 阅读4分钟

维基百科JavaScript的定义:

  • JavaScript是一种高级的,解释型的编程语言;

  • JavaScript是一门基于原型,头等函数的语言,是一门多范式的语言,支持面向对象程序设计,指令式编程,以及函数式编程.

JavaScript的组成:

  • ECMAscript(定义语言规范)
  • DOM(用于操作文档的API)
  • BOM(用于操作浏览器的API)

浏览器内核:

常说的浏览器内核指的是浏览器的排版引擎(或者页面渲染引擎)

  • Gecko:早期被网景和火狐浏览器使用
  • Trident:微软开发,被IE4~IE11浏览器使用,但是Edge已经转向Blink
  • Webkit:苹果基于KHTML开发,用于Safari,谷歌早期也在使用
  • Blink:是Webkit的分支,谷歌开发,目前用于谷歌,Edge,Opera等

JavaScript引擎:

用于解析,执行JavaScript代码

  • SpiderMonkey:第一款JavaScript引擎,JavaScript作者开发
  • Chakra:微软开发
  • JavaScriptCore:Webkit中的JavaScript引擎,苹果公司开发
  • V8:谷歌开发

JavaScript的编写方式:

  • HTML标签元素内部
  • script标签中
  • 外部script文件
浏览器不支持JavaScript时,优雅降级处理
<noscript>您的浏览器不支持或者关闭运行JavaScript</noscript>

变量使用注意:

  • 变量未声明直接声明会报错
  • 变量有声明没有赋值,默认值undefined
  • 没有使用var声明变量不会报错,但是变量会被添加在window对象上

JavaScript中的8种基本数据类型:

  • 原始数据类型:
    • Number
    • String
    • Boolean
    • Undefined
    • Null
    • BigInt
    • Symbol
  • 复杂数据类型:
    • Object

typeof()的用法:

​ typeof是一个操作符,并不是一个函数,()只是将内容当做一个整体.

Number类型:

除了正常的数值赋值,还有:

  • Infinity:无穷大

  • NAN:not is a Number (如var num = 3 * "123")

String类型:

``(tab键上面):定义时使用此符号包裹字符串,那么字符串中可使用插值表达式如:

var num1 = 1;
var num2 = 2;
var str = `两数相加为:$(num1+num2)`;

类型转换:

其他类型转换为Number类型:

  • undefined->NaN
  • Null->0
  • true->1
  • false->0
  • ""(空字符串即不包含空格)->0
  • 去掉首尾的纯数字字符串->所包含的数字
  • 类型转换失败时->NaN

其他转换为boolean类型:

  • 0,Null,undefined,NAN,""(空字符串即不包含空格)->false
  • 其他值->true

==和===的区别:

  • ==在比较不同类型时,会进行类型转换(大多数转换为数值型),再进行比较
  • ===如果比较不同类型会立即返回false

逻辑或的本质:

||:逻辑或(短路或)->从左到右依次计算操作数,结果为true,返回这个操作数的初始值,如果所有操作数都被计算过,则返回最后一个操作数

逻辑与的本质:

&&:逻辑与(短路与)->从左至右依次计算操作数,结果为false,返回这个操作数的初始值,如果所有操作数都被计算过,则返回最后一个操作数

函数的使用:

声明函数
function 函数名(形参) {
    函数封装的代码
    .....
}
函数表达式
var foo = function(){
    函数封装的代码
    .....
}
调用函数
函数名();
函数没有返回值时,返回值默认为undefined

函数的arguments参数:

  • arguments对象是所有(非箭头)函数都可以使用的局部变量;
  • arguments为object类型,并非为数组
  • 用法和数组相似,但具体使用可转换为数组

作用域和函数作用域:

  • 作用域(scope):表示一些标识符的作用有效范围
  • 函数作用域:表示在函数内部定义的变量,只有在函数内部可以被访问

立即执行函数:

在被定义完就立即执行的函数就是立即执行函数

(function(){
  函数封装的代码块
  ...
})();

会创建一个独立的执行上下文环境,可以避免外界访问或者修改内部的变量,也避免对内部变量的修改.

对象类型:

使用{...}创建对象类型,包含键值对{key:value},key是字符串,ES6之后也可以是symbol类型,value可以是任意类型.

对象的创建

//1.对象字面量
var obj1 = {
    name:"李四"
}
//2.new Object()
var obj2 = new Object()
obj2.name = "王五"
//3.new 其他类
function Person() {}
var obj3 = new Person()

对象的遍历

var info = {
    name:"李四",
    age:18,
    height:1.99
}
var infoKeys = Object.keys(info)
for(let i = 0; i < infoKeys.length; i++){
    var key = infoKeys[i]
    var value  = info[key]
}

栈内存和堆内存

  • 原始数据类型占据的空间是在栈内存中分配的

  • 对象数据类型占据的空间是在堆内存中分配的

内存.png

引用类型.png

函数中的this指向两种情况

//函数中默认的属性除了arguments还有this
//情况一:如果普通函数被默认调用,那么this指向window
function(){
    console.log(this)
}
//情况二:如果函数是被某一个对象引用并且调用它,那么this会指向这个对象
var obj = {
    playing:function(){
        console.log(this)
    }
}
obj.playing()

构造函数

普通函数被使用new操作符来调用,那这个函数就称之为构造函数,new操作符调用函数之后,执行操作如下:

  • 在内存中创建一个新对象(空)
  • 这个对象内部的[[prototype]]属性会被赋值为该构造函数的prototype属性
  • 构造函数内部的this,会指向创建出来的新对象
  • 执行函数的内部代码
  • 如果构造函数没有返回非空对象,则返回创建的新对象

ES5之前,通过function声明一个构造函数(类),之后使用new关键字进行调用(局限性)

ES6之后,通过class声明一个类

包装类型

1、Number

  • toString(base):将数字转换成字符串,并且按照base进制进行转换
  • toFixed(digits):格式化一个数字,保留digits位小数

2、内置Math

  • Math.floor:向下取整
  • Math.ceil:向上取整
  • Math.round:四舍五入取整
  • Math.random:生成0~1的随机数 (不包含1)
  • Math.pow(x,y):返回x的y次幂

3、Array数组

  • 尾端添加或者删除
    • push:末端添加
    • pop:末端取出
  • 首端添加或者删除
    • shift:首端取出,向前移动
    • unshift:首端添加,向后移动
  • slice(start,end):裁剪数组,不会修改原数组
  • concat:数组拼接
  • join:以某种方式将数组拼接位字符串

数组的高阶函数

1、filter()

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var arr2 = arr.filter(function(x, index) {
	return index % 3 === 0 || x >= 8;
});
console.log(arr2);  //[1, 4, 7, 8, 9, 10]

2、find()

let arr = [1, 2, 3, 'arr', 5, 1, 9];

console.log(arr.find((value, keys, arr) => {
    return value > 2;
})); // 3 返回匹配的值