javascript
script 标签一旦用于引入外部文件了,就不能再编写代码,即使编写了浏览器也会忽略
ASCII ANSI ISO-8859-1 Unicode(UTF-8)
ASCII 是互联网上计算机之间使用的第一个字符集(编码标准)
- ASCII 控制字符(00-31,加上127)最初被设计用来控制诸如打印机和磁带驱动器之类的硬件设备。
- ASCII 是一种7位字符集,包含了128个字符。
支持0-9数字,大/小写英文字母(a-z、A-Z)和一些特殊的字符。
ISO-8859-1(在 HTML 4.01 中是默认的)和 UTF-8(在 HTML5 中是默认的)都是基于 ASCII 建立的。
JS中数字最大值 Number.MAX_VALUE 最小正值 Number.MIN_VALUE
使用 typeof
检查 Infinity 会返回 number
使用 typeof
检查 NaN 也会返回 number
进制 0x十六进制 0八进制 0b2进制
使用 typeof 检查一个 null 时,会返回 object
使用 typeof 检查一个 undefined 时,会返回 undefined
使用 typeof 检查一个数组时,会返回 object
将其他的数据类型转换为 String
方式一:
- 调用被转换数据类型的 toString() 方法
- 该方法不会影响到原变量,他会将转换的结果返回
- 但是注意:null 和 undefined 这两个值没有 toString 方法 如果调用会报错
方式二:
- 调用 String() 函数,并将被转换的数据作为参数传递给函数
- 使用 String() 函数做强制类型转换时,
对于 Number 和 Boolean 实际上就是调用 toString() 方法
但是对于 null 和 undefined,就不会调用 toString() 方法
它会将 null 直接转换为 "null"
它会将 undefined 直接转换为 "undefined"
方式三:
任何值和字符串做加法运算,都会先转换为字符串,然后再和字符串做拼串的操作
只需要为任意的数据类型+一个"" 即可将其转换为 String 类型,这是一种隐式的类转换,由浏览器自动完成,实际上它也是调用 String()
将其他的数据类型转为 Number
方式一:使用 Number() 函数
- 字符串 -> 数字
如果是纯数字的字符串,则直接将其转换为数字
如果字符串中有非数字的内容,则转换为 NaN
如果字符串是空串或者是一个全是空格的字符串,则换为0 - 布尔 -> 数字
true 转成1
false 转成0 - null -> 数字
转成0 - undefined ->数字
转成NaN
方式二:专门用来对付字符串
parseInt() 把一个字符串转换为一个整数
parseFloat() 把一个字符串转换为一个浮点
parseInt() 可以将一个字符串中的有效的整数内容取出然后转换为 Number
parseFloat() 作用和 parseInt() 类似,不同的是它可以得有效的小数
如果对非 String 使用 parseInt() 或 parseFloat() 它会将其转换为 String 然后再做转换
方式三:
- 任何值做 - * / 运算都会自动转换为 Number 我们可以过为一个值 -0 *1 /1来其转换为 Number
- 可以对其他的数据类型使用+,来将其转换为 Number 的原理和 Number() 函数一样
将其他的数据类型转换为Boolean
方式一:
使用 Boolean() 函数
- 数字 -> 布尔
除了0和 NaN,其余的都是 true - 字符串 -> 布尔
除了空串,其余的都是 true - null、undefined -> 布尔
都转换为 false - 对象也会转换为 true
方式二:
可以为一个任意的数据类型取反两次,来将其转换为布尔值,原理和 Boolean() 一致
js 中的"与"属于短路的与,如果第一个值为 false,则不会看第二个值
js 中的"或"属于短路的或,如果第一个值为 true,则不会看第二个值
对于非布尔值进行与或运算时,会将其转换为布尔值,然后再运算,并且会返回原值
任何值和 NaN 做运算结果都是 NaN 任何值和 NaN 做比较都是 false
对于非数值进行比较时,会将其转换为数字然后再比较 如果符号两侧的值都是字符串时,不会将其转换为数字进行比较,而会分别比较字符串中字符的 Unicode 编码
相等运算符(比较时大多转换为数字类型做比较)除以下特殊
console.log(null == 0) //false
/*
undefined 衍生自null
所以这两个值做相等判断时,会返回true
*/
console.log(undefined == null);
// NaN不和任何值相等,包括它本身
console.log(NaN == NaN); //false
// 可以通过isNaN()函数来判断一个值是否是NaN
console.log(isNaN(NaN));
条件分支语句在执行时会依次将 case 后的表达式的值和 switch 后的条件表达式的值进行全等比较
js 中的变量都是保存到栈内存中的
基本数据类型的值直接在栈内存中存储,值与值之间是独立存在修变量不会影响其他的变量
对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中一个新的空间,而变量保存的是对象的内存地址(对象的引用)
立即执行函数
/*
函数执行完了,立即被调用,这种函数叫做立即执行函数
立即执行函数往往只会执行一次
*/
(function(){
console.log('---')
})()
枚举对象中的属性值
//能获得对象原型上的属性
for(var n in obj) {
console.log("属性名:" + n);
console.log("属性值:" + obj[n]);
}
声明提前
/*
变量的声明提前
使用 var 关键字声明的变量,会在所有的代码执行之前会被声明
但是如果声明变量时不使用 var 关键字,则变量不会声明提前
*/
console.log("a=" + a);
// a=123; //报错
var a = 123;
/*
函数的声明提前
-使用函数声明形式创建的函数 function 函数(){}
它会在所有的代码执行之前就被创建,所以我们可以在函数声明前来调用函数
-使用函数表达式创建的函数,不会被声明提前,所以不能声明前调用
*/
fun();
//fun2() //报错
function fun() {
console.log("我是一个fun函数");
}
var fun2 = function () {
console.log("我是一个fun2函数");
};
在函数中,不使用 var 声明的变量都会成为全局变量
var c = 33;
function fun5() {
console.log("c=" + c);
c = 10;
}
fun5(); //c=33
console.log(c); //c=10
this
解析器在调用函数时每次都会向函数内部传递进一个隐含的参数,这个参数就是 this
this 指向的是一个对象,这个对象我们称为函数执行的上下文对象
根据函数的调用方式不同,this 会指向不同的对象
- 以函数的形式调用时,this 永远都是 window
- 以方法的形式调用时,this 就是调用方法的那个对象
- 以构造函数的形式调用时,this 就是新创建的那个对象
- 使用 apply 和 call 调用时,this 是指定的那个对象
构造函数的执行流程
- 立即创建一个新的对象
- 将新建的对象设置为函数中的 this,在构造函数中可以使用 this 来引用新建的对象
- 逐行执行函数中的代码
- 将新创建的对象作为返回值返回
原型对象 prototype
我们所创建的每一个函数,解析器都会向函数中添加一个 prototype
这个属性对应着一个对象,这个对象就是我们所谓的原型对象
原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象
我们可以将对象中共有的内容,统一设置到原型对象中
我们创建构造函数时,可以将这些对象共有的属性和方法统一添加到构造函数的原型对象中
这样不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每个对象都具有这些属性和方法了
隐式原型对象 __proto__
如果函数作为普通函数调用 prototype 没有任何作用
当函数以构造函数的形式调用时,他所创建的对象中都会有一个隐含的属性
指向该构造函数的原型对象,我们可以通过 __proto__ 来访问该属性
属性查找
//使用 in 检查对象中是否含有某个属性,如果对象中没有但是原型中有,也会返回 true
console.log('name' in mc)
//可以使用对象的 hasOwnProperty() 来检查对象自身中是否含有该属性
mc.hasOwnProperty('name')
Object 对象的原型没有原型,如果在 Object 原型中依然没有找到则返回 undefined
当我们直接在页面中打印一个对象时,实际上是输出的对象的 toString() 方法的返回值
如果我们希望在输出对象时不输出 [object Object],可以为对象添加一个 toString() 方法
http 请求
// 创建对象
const x = new XMLHttpRequest()
// 初始化
x.open('GET', 'url')
// 发送
x.send()
//事件绑定
x.onreadystatechange = function() {
if(x.readyState === 4) {
if(x.status >= 200 && x.status < 300) {
// 成功
return x.response
}else {
// 失败
return x.status
}
}
}
数组方法
push()
-方法返回数组的新长度
pop()
-该方法可以删除数组的最后一个元素,并将被删除的元素作为返回值返回
unshift()
-向数组开头添加一个或多个元素,并返回新的数组长度
shift()
-可以删除数组的第一个元素,并将被删除的元素作为返回值返回
slice()
-可以从已有数组中返回选中的元素,返回一个新的数组,包含从 start 到end (不包括该元素)的 arrayObject 中的元素。
- 第二个参数可以省略不写,此时会截取从开始索引往后的所有元素
- 索引可以传递一个负值,如果传递一个负值,则从后往前计算(-1倒数第一个 -2倒数第二个)
splice()
-可以向/从数组中添加/删除项目,然后返回被删除的项目。会改变原始数组
- 第一个参数表示开始位置的索引
- 第二个表示删除的数量
- 第三个及以后可以传递一些元素,这些元素会插入到开始位置索引前面
arrayObject.splice(index, howmany, item1, ..., itemX)
concat()
-可以连接两个或多个数组,并将新的数组返回 该方法不会对原数组产生影响
reverse()
-该方法会直接修改原数组
sort()
-该方法会直接修改原数组 默认会按照 Unicode 编码进行排序
/*
-对于纯数字数组浏览器会根据回调函数的返回值来决定元素的顺序,
如果返回一个大于0的值,则元素会交换位置
如果返回一个小于0的值,则元素位置不变
如果返回一个0,则认为两个元素相等,也不交换位置
*/
arr = [3, 4, 11, 2, 5]
arr.sort(function (a, b) {
// return a-b; //升序
// return b-a; //降序
})
函数的方法
/*
-这两个方法都是函数对象的方法,需要通过函数对象来调用
-当对函数调用 call() 和 apply() 都会调用函数执行
-在调用 call 和 apply 时可以将一个对象指定为第一个参数
此时这个对象将会称为函数的 this
-call() 方法可以将实参在对象之后依次传递
-apply() 方法需要将实参封装到一个数组中统一传递
*/
var obj = {}
function fun(a, b) {
console.log(a, b)
}
// fun.call(obj)
fun.call(obj, 1, 2)
fun.apply(obj, [1, 2])
//bind() 不同的是它不会立即调用函数 它返回一个函数
const newFunc = fun.bind(obj, 1)
newFunc(2)
在调用函数时,浏览器每次都会传递两个隐含的参数
- 函数的上下文对象 this
- 封装实参的对象 arguments
//arguments 是一个类数组对象,他也可以通过索引来操作数据,也可以获取长度
//在调用函数时,我们所传递的实参都会在 arguments 中保存
//它里面有一个属性叫做 callee 这个属性对应一个函数对象,就是当前正在指向的函数的对象
function fun() {
console.log(arguments);
// console.log(arguments instanceof Array);
// console.log(Array.isArray(arguments));
console.log(arguments.length)
console.log(arguments.callee)
}
Date 对象
//如果直接使用构造函数创建一个 Date 对象,则会封装为当前代码执行的时间
var d = new Date();
//创建一个指定的时间对象 需要在构造函数中传递一个表示时间的字符串作为参数
//日期的格式 月份/日/年 时:分:秒
var d2 = new Date('12/02/2016 11:10:20')
console.log(d);
//getDate() -获取当前日期对象是几日
var date = d.getDate();
//getDay() -获取当前日期是周几 会返回0-6的值 0表示周一
//getMonth() -获取当前日期的月份 会返回0-11的值 0表示1月...
//getFullyear() -获取当前日期的年份
/*
getTime()
-获取当前日期对象的时间戳
-时间戳,指的是从格林威治标准时间的1970年1月1日 0时0分0秒到当前日期的毫秒数
-计算机底层在保存时间时都是使用时间戳
*/
//获取当前的时间戳 -Date.now()
time = Date.now();
console.log(time)
Math
Math 和其他的对象不同,它不是一个构造函数 它属于一个工具类,不需要创建对象,它里面封装了数学运算相关的属性和方法
// 属性
Math.PI
// 方法
Math.abs()// 返回数的绝对值
Math.ceil()// 对数进行上舍入
Math.floor()// 对数进行下舍入
Math.round()// 四舍五入
Math.max() Math.min()
Math.pow(x, y)// 返回x的y次幂
Math.sqrt()// 返回数的平方根
Math.random()// 可以生产一个0-1之间的随机数
包装类 String() Number() Boolean()
方法和属性只能添加给对象,不能添加给基本数据类型
当我们对一些基本数据类型的值去调用属性和方法时,浏览器会临时使用包装类将其转换为对象,然后再调用对象的属性和方法,调用完之后,再将其转换为基本数据类型
字符串相关方法
// 创建一个字符串
// 在底层字符串是以字符数组的形式保存的 ['H', 'e', 'l', '']
// length 获取字符串的长度
var str = "Hello Atgiuiy";
// charAt() 返回字符串中指定位置的字符 根据索引获取指定的字符
// charCodeAt() 获取指定位置字符的字符编码(unicode)
// String.fromCharCode() 可以根据字符编码获取字符
// concat() 可以用来连接两个或多个字符串 作用和加号一样
/*
indexOf()
该方法可以检索一个字符串中是否含有指定内容
如果字符串中含有该内容,则会返回其第一次出现的索引 如果没有找到指定的内容,则返回-1
可以指定第二个参数,指定开始查找的位置
lastIndexOf()
该方法用法和indexOf一样,lastIndexOf从后往前找
*/
/*
search()
可以搜索字符串中是否含有指定内容
如果搜索到指定内容,则会返回第一次出现的索引,如果没有搜索到返回-1
他可以接受一个正则表达式作为参数,然后根据正则表达式去检索字符串
这个方法只会查找一个,即使设置全局匹配也没用
*/
// match()
// replace()
// slice() 可以从字符串中截取指定的内容 不会影响原字符串
/*
substring()
可以用来截取一个字符串,和slice()类似
参数:
第一个:开始截取位置的索引(包括开始位置)
第二个:结束位置的索引(不包括结束位置)
不同的是这个方法不接受负值作为参数
如果传递了一个负值,则默认使用0,而且还自动调整参数的位置,如果第二个参数小于第一个,则自动交换
*/
/*
substr()
用来截取字符串
参数:
1.截取开始位置的索引
2.截取的长度
*/
/*
split()
可以将一个字符串拆分为一个数组
参数:
需要一个字符串作为参数,将会根据该字符串去拆分
*/
// toUpperCase() 将一个字符串转换为大写并返回
// toLowerCase() 将一个字符串转换为小写并返回
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具