Javascript-basic
计算机语言 --> 人与计算机之间沟通交流的语言
编程语言 --> 定义计算机程序的形式语言
编程语言特点:
- 数据和数据结构
- 指令及流程控制
- 引用机制和重用机制
- 设计哲学
Js发展史
Js的组成
ES ------> 定义语言规范
DOM -----> 用于操作文档的API
BOM ------> 用于操作浏览器的API
js基础 (BOM、DOM)
js高级 底层、v8 、 浏览器底层、内存管理、手写源码
ECMAScript 1997 ---至今
浏览器内核 指的就是浏览器排版引擎 js代码由js引擎来执行
为什么需要js引擎
高级语言都需要转成最终的机器指令来执行 js无论是交给浏览器或者Node执行,最后都需要被CPU执行 但CPU只认识自己的指令集 因此需要js引擎来帮我们把js代码翻译成为CPU指令来执行
运行引擎
SpiderMonkey 第一款JS引擎,由Brendan Eich开发 (js作者) Chakra 微软开发用于IT浏览器 JavascriptCore webkit中的引擎 apple公司开发 V8
WebCore 负责HTML解析、布局、渲染等相关的工作 JavascriptCore 解析、执行js代码
Js编写方式
<noscript>
元素 被用于给不支持Js的浏览器提供替代内容 js编写注意事项
- script元素不能写成但标签
- 省略tpye属性
- 加载顺序 自上而下的顺序
Js交互方式
- alert函数 接受
- console.log()
- document.write('hello world')
- prompt函数 var res = prompt() alert('内容是: ' + res)
交互方法 | 方法说明 | 效果查看 |
---|---|---|
alert | 接受1个参数 | 弹窗查看 |
console.log() | 接受多个参数 | 浏览器控制台查看 |
document.write | 接受多个字符串 | 在浏览器页面查看 |
prompt() | 接受一个参数 | 在浏览器接受用户输入 |
Js语句和分号
----> js讲换行符理解成隐式的分号 (自动插入分号)
Js的注释
- 单行注释
- 多行注释
- 文档注释
推荐插件
- ES7+ React/Redux/React-Native snippets
Js的变量
变量 --> 一个用于存放数值的容器 这个数组可以是数字、字符串或其他任意的数据 特点 ==> 存放的数值是可以改变的
变量命名规则
- 第一个字符必须为一个字母、下划线(_)、或一个美元符号($)
- 其他字符可以是字母、下划线、美元符号
- 不能使用关键字、保留字命名 参考MDN
- 变量严格区分大小写
命名规范
- 多个单词使用驼峰(小驼峰)标识
- 赋值 = 两边加上空格
- 语句结束加上分号
- 变量命名做到 见名知意
JS的基本数据类型 (7原始+1复杂类型)
Number 、String 、 Boolean 、Undefined 、 Null(未知的值) 、 Object(复杂类型) 、BigInt Symbol (唯一的标识符)
console.log(null == undefined) true
因为在js中它们都表示一个未定义或空值 两者进行比较时 ==> 类型转化 js将两者视为同一类型的值(都是特殊的未定义值)
Number类型
- number代表整数、浮点数
- Infinity 代表 无穷大
- NaN(not a number) 代表一个计算错误
进制表示
js
var num = 100 // 10进制
var num2 = 0x100 // 16
var num3 = 0o100 // 8
var num4 = 0b100 // 2
数字表示范围
js
var max = Number.MAX_VALUE
var min = Number.MIN_VALUE
isNaN 用于判断是否不是一个数字
- 不是数字----> true
- 是数字----> false
String类型
引号使用 单引号、双引号、反引号、转义字符
js
var msg = 'you are the best \'\' is person'
console.log(msg)
Boolean 类型
一般用来表示真假
Undefined类型
只有一个值 undefined
Object类型
特殊的类型 通常称为引用类型和复杂类型 其他的数据我们通常称为原始类型 它们的值值只包含一个单独的内容(字符串、数字) Object 往往可以表示一组数据,是其他数据的一个集合
一个对象被初始化为空 在内存角度,在堆内存中创建一个真正的对象 如果不希望被创建 则可以赋值为null 在内存地址中为0x0 null ==> Boolean类型 为false
初始化为{}, ==> Boolean类型 , 为true
WARNING
null存在的意义 就是对 对象进行初始化的
Null 类型
通常用来表示一个对象为空,所以通常在给对象进行初始化时,赋值为null
null与undefined的关系 undefined 通常只有在一个变量声明但未初始化时,默认值为undefined 一个变量准备保存为一个对象,但是这个对象不确定时,可以赋值为null
JS类型转换
显式类型转换优先级高于隐式类型转换
- Js中隐式转换的优先级原则
- 布尔值转数字
- 字符串转数字
- 对象转原始值 通过valueOf() toString()方法将对象转换为原始值
WARNING
如果 valueOf() 方法返回的是对象,则 toString() 方法将被调用。如果 toString() 方法返回的是对象,则将抛出类型错误
一个字符串和其他类型进行+操作 则自动转化为字符串类型进行拼接
js
var isAdmin = true
var admin = isAdmin + ''
console.log(typeof admin) ;// string
- 显式类型转换优先级规则
- Number()函数: 可以将任何类型的值转换为数字
- String()函数: 可将任何类型的值转换为字符串
- Boolean()函数:可将任何类型的值转换为布尔值
Number()中的规则
值 | 转换后的值 |
---|---|
undefined | NaN |
null | 0 |
true false | 1 & 0 |
string | 去掉首尾空格的纯数字字符串中含有的数字 如果剩余字符串为空,则转换结果为0 否则将从剩余字符串中读取数字 当类型转换出现error时返回NaN |
Boolean()中的规则
值 | 转换后的值 |
---|---|
0,null,undefined,NaN,"" | false |
其他值 | true |
true false | 1 & 0 |
WARNING
js中非空字符串总为true console.log(Boolean("0")); // true console.log(Boolean("")); // false
typeof 操作符
ECMAScript的类型系统是松散的 需要一种手段来确定任意变量的数据类型 typeof
对于一个值 typeof会返回下列字符串之一: undefined 表示值未定义 、Boolean 值为布尔值 string 值为字符串 、function 值为函数 object 值为对象或null、symbol 值为符号 、number 值为数字
typeof 为什么不能判断Null Object
一个对象被初始化为空 在内存角度,在堆内存中创建一个真正的对象 如果不希望被创建 则可以赋值为null 在内存地址中为0x0 null ==> Boolean类型 为false
初始化为{}, ==> Boolean类型 , 为true
运算符
算术运算符、赋值运算符、关系运算符、逻辑运算符
运算元 ---运算符应用的对象
一元运算符 + -
三运运算符 a>0 ? 1:0
算术运算符
- 加法(+):使用加法运算符可以将两个数相加。
- 减法(-):使用减法运算符可以从第一个数中减去第二个数。
- 乘法(*):使用乘法运算符可以将两个数相乘。
- 除法(/):使用除法运算符可以将第一个数除以第二个数。
- 取模(%):使用取模运算符可以计算两个数的余数。
- 自增(++):使用自增运算符可以将一个数的值增加 1。
- 自减(--):使用自减运算符可以将一个数的值减少 1。
INFO
ES7也叫做ES2016 2**3 代表 2的3次幂 结果为 8 等同于Math.pow(2,3)
++i-->它在先加 1 再返回该值。 i++-->它先返回该值,再加 1。
js
var i = 10;
console.log(++i); // 11
var i = 10;
console.log(i++); // 10
赋值运算符
- 简单赋值(=):使用简单赋值运算符可以将值赋给变量。
js
var a = 10;
- 复合赋值(+=、-=、*=、/=、%=):复合赋值运算符可以简化复杂的赋值运算。
js
Copy code
var a = 10;
a += 5; // a 的值现在是 15
下面是 JavaScript 中运算符的优先级列表,从高到低排列:
- 圆括号(())
- 单目运算符(++、--、!、typeof)
- 乘法(*)、除法(/)和取模(%)
- 加法(+)和减法(-)
- 关系运算符(>, >=, <, <=, ==, !=)
- 逻辑运算符(&&、||)
- 赋值运算符(=、+=、-=、*=、/=、%=)
在运算时,如果有多个运算符,那么具有较高优先级的运算符会先被处理,再进行具有较低优先级的运算。可以使用圆括号来强制规定特定的运算顺序。
比较运算符
运算符 | 描述 |
---|---|
== | 如果两个值相等,则返回 true。 |
!= | 如果两个值不相等,则返回 true。 |
=== | 如果两个值类型和值都相等,则返回 true。 |
!== | 如果两个值类型和值不都相等,则返回 true。 |
> | 如果左值大于右值,则返回 true。 |
>= | 如果左值大于等于右值,则返回 true。 |
< | 如果左值小于右值,则返回 true。 |
<= | 如果左值小于等于右值,则返回 true。 |
=== 和 ==的区别
== 在不相同类型下,会将运算元进行类型转换,然后再比较它们的值
=== 则不进行类型转换,只会在两个操作数类型和值都相等的情况下返回true
TIP
== 存在的问题 ,不能区分0和false , 或者空字符串和false这里运算
逻辑运算符
- &&(逻辑与):返回两个操作数的逻辑与,如果两个操作数都为真,则返回真,否则返回假。
- ||(逻辑或):返回两个操作数的逻辑或,如果两个操作数至少有一个为真,则返回真,否则返回假。
- !(逻辑非):返回一个操作数的逻辑非,如果操作数为真,则返回假,否则返回真。
逻辑或的本质
脱离分支语句 单独使用逻辑或
先将运算元转化为Boolean类型
对转成的Boolean类型进行判断 如果为true就直接返回 (运算元的原类型)
如果所有的操作数都被计算过(转化结果都为false),则返回最后一个操作数
顺序 左--> 右
逻辑与的本质
拿到第一个运算元,将运算元转换成Boolean类型
对运算元的Boolean类型进行判断
如果为false 返回运算元(原始值) true, 查找下一个继续运算
分支语句
程序中分为三种不同的执行方式
- 顺序 ==> 上到下,顺序的执行代码
- 分支 ==> 根据条件判断,决定代码的分支
- 循环 ==> 让特定的代码重复执行
Js中常见的分支结构
- if分支结构
if分支结构 单分支结构 if 多分枝结构 if...else.. if...elseif ...else..
- switch分支结构
js
var btnIndex = 0;
switch (btnIndex){
case 0:
console.log(`111`)
case 1:
console.log(`222`)
case 3:
console.log(`333`)
break;
default:
console.log(`final`)
}
// 若不加 break ,这个case的过程叫做 case穿透
循环语句
- while循环
条件成立 ==> 执行代码块
不成立 ==> 跳出代码块
若条件一直为true,则产生死循环 尽量避免
- do while循环
特点: 无论条件是否成立,do循环体都会先执行一次
js
var count = 0;
do {
console.log('count: ' + count);
count++;
}while (count<10);
- for循环
js
var names =['a','b','c','d','e','f'];
for(var i = 0; i < names.length; i++){
if(names[i] === 'd'){
return i;
}
}
循环控制 通常为2种
- break 中断 直接跳出去
- continue 跳过当前的条件 去执行后续的操作