前端面试准备笔记之JavaScript(01)
2024-10-19 04:57:25
1.1 typeof 能判断哪些类型?
- typeof可以识别所有的值类型
- typeof可以识别函数 //function
- typeof可以判断是否是引用类型(不可以再细分) //object
1.2 javascript如何检测一个变量是一个String类型?请写出函数实现
- 方法一 typeOf
function isString(obj) {
return typeof(obj) === "string"? true:false
}
- 方法二 constructor
constructor 属性,返回对创建此对象的,数组函数的引用
function isString(obj) {
return obj.constructor === "String" ? true: false
}
- 方法三 Object.prototype.toString.call
使用Object.prototype 上的原生toString方法判断数据类型,可以判断基本类型(null undefined "abc" 123 true),可以判断引用类型(函数类型 日期类型 数组类型 正则表达式 自定义类型(这种不能准确判断需要通过instanceof操作符来判断),可以判断原生JSON对象)
function isString(obj) {
return Object.prototype.toString.call(obj) === "[object String]"? true:fasle
}
1.3 何时使用 === 何时使用 ==
1.4 值类型和引用类型的区别
- 值类型(占用空间小):字符串、数值、布尔值、undefined、symbol(es6新加,为了解决对象属性名重复)
- 占用空间固定,保存在栈中,当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这个栈内存里,随着方法执行结束,这个方法的内存栈也自然销毁了。
- 保存与复制的是本身
- 使用typeof检测数据类型
- 基本类型数据是值类型
- 引用类型(占用空间大):对象、数组、函数(特殊的引用类型,不用于存储数据,没有拷贝和复制函数一说)、null(特殊的引用类型指向空地址)
- 引用类型占用空间不固定,保存在堆中。堆内存中的对象不会随方法的结束而销毁,即便这个方法结束后,这个对象还可能被另一个引用变量所引用,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。
- 保存与复制的是指向对象的一个指针
- 使用instanceof检测数据类型
- 使用new()方法构造出的对象是引用型
1.5 手写深拷贝
浏览器默认使用的是浅拷贝
function deepClone(obj = {}) {
if(typeof obj !== 'object' || obj == null){
// obj 是null或者是值类型不是对象或数组,直接返回
return obj
}
// 初始化返回结果
let result
if (obj instaceof Array) {
result = []
} else {
result = {}
}
for (let key in obj) {
// 保证 key 不是原型的属性
if (obj.hasOwnProperty(key)) {
// 递归调用
result[key] = deepClone(obj[key])
}
}
//返回结果
return result
}
- 对象转字符串 JSON.stringify(obj)
- JSON字符串转对象 JSON.parse(obj)
1.6 变量计算(类型转换)
- 字符串拼接
const a = 100 + 10 //110
const b = 100 + '10' //'10010'
const c = true + '10' //'true10'
- ==
// 以下如果用=== 都是false
100 == '100' // true
0 == '' // true
0 == false // true
false == '' //true
null == undefined // true
//obj.a == null相当于:
obj.a === null||obj.a === undefined
其他情形一律用 ===
- if语句
// truly 变量:!!a === true 的变量
两部非运算是true,就是truly 变量
// falsely变量:!!a === false 的变量
两部非运算是false,就是falsely变量
!!0 === false
!!NaN === false
!!'' === false
!!null === false
!!undefined === false
!!false === false
- 逻辑判断
10 && 0 //0
''|| 'abc' //'abc'
!window.abc // true
1.7 请用js去除字符串的空格?
- 方法一:使用replace正则匹配的方法
去除所有空格: str = str.replace(/\s*/g," ")
去除两头空格: str = str.replace(/^\s|\s$/g,"");
去除左空格: str = str.replace( /^\s*/, “”);
去除右空格: str = str.replace(/(\s*$)/g, "");
- 方法二:使用str.trim()方法
str.trim()局限性:无法去除中间的空格
同理,str.trimLeft(),str.trimRight()分别用于去除字符串左右空格。
- 方法三:使用jquery,$.trim(str)
- $.trim(str)局限性:无法去除中间的空格,实例如下:
1.8 js 字符串操作函数
https://www.w3school.com.cn/jsref/jsref_obj_string.asp
字符串的对象属性:constructor(创建此对象的函数引用;length(字符串的长度);prototype(允许您有能力向对像添加属性和方法)
- concat(str1,str2,str3...) -- 将两个或多个字符的文本组合起来,返回也给新的字符串。
- indexOf() -- 返回字符串中一个子串第一处出现的索引。如果没有匹配项,返回-1
- charAt(number) -- 返回指定位置的字符。
- lastIndexOf(string) -- 返回字符中一个子串最后一处出现的索引,如果没有匹配项,返回-1。
- match(regexp) -- 检查一个字符串是否匹配一个正则表达式。
- substr(start,length) -- 返回从字符串中抽取从start下标开始的指定数目的字符,第二个参数是长度。
- substring(start,stop) -- 用于提取字符串中介于两个指定下标之间的字符。
- slice(start,end) -- 提取字符串的某个部分,并以新的字符串返回提取的部分。
- replace() -- 用来查找匹配一个正则表达式的字符串,然后使用新的字符串代替匹配的字符串。
- search() -- 执行一个正则表达式匹配查找。如果成功,返回字符串中匹配的索引值。否则返回-1
- split() -- 通过将字符串划分成一个个子串,返回一个字符串数组。
- length -- 返回字符串的长度,长度包含字符的个数。
- toLowerCase() -- 将整个字符串转化成小写。
- toUpperCase() -- 将整个字符串转化成大写。
1.9 数组的操作函数
https://www.w3school.com.cn/jsref/jsref_obj_array.asp
数组的对象属性:constructor(返回创建此对象的数据的引用;length(设置或返回数组中元素的数目);prototype(使您有能力向对像添加属性和方法)
- concat(arr1,arr2,arr3...) -- 连接两个或更多的数组,并返回结果。
- join(separator) -- 把数组的所有元素放入一个字符串并以指定符号连接。参数可选默认是逗号。
- pop() -- 删除并返回数组的最后一个元素。
- push() -- 向数组的末尾添加一个或多个元素,并返回新的长度。
- reverse() -- 颠倒数组中元素的顺序。
- shift() -- 删除并返回数组的第一个元素。
- slice(start,end) -- 从某个已有的数组返回选定的元素。参数end可选,并且不包含该元素。
- sort() -- 对数组的元素进行排序。
- splice(index,howmany,item1...) -- 删除元素,并向数组添加新的元素。
- toSource() -- 返回该对象的源代码。
- toString() -- 将数组转化位字符串,并返回结果之间用逗号间隔。
- toLocaleString() -- 将数组转化为本地数组,并返回结果。
- unshift() -- 向数组的开头添加一个或更多元素,并返回新的长度。
- valueOf() -- 返回数组对象的原始值。该方法通常是在js后台自动调用,并不出现在代码中。
最新文章
- Debian-based Linux distributions 安装 virtualbox
- 【poj1386】 Play on Words
- 求教——使用node做表单,刷新浏览器页面,浏览器为什么会重复提交上次所填的信息
- matlab之waitbar() delete() close()
- JavaScript变量——栈内存or堆内存
- svn 大杂烩
- 《Java数据结构与算法》笔记-CH5-链表-2单链表,增加根据关键字查找和删除
- ASP.NET入门(class0612)
- ES6的let命令实现猜想
- nginx负载 发向代理配置文件参考
- 深入Java虚拟机——类型装载、连接(转)
- 精通javasCRIPT-学习笔记 Features,Functions,Object
- 实现mypwd和mybash
- div+css+position实现简单的纵向导航栏
- 【编译原理】c++实现自上而下语法分析器
- 将任何GitHub内的代码转为外部CDN网址
- Is It A Tree?----poj1308
- python 获取IP
- 传说中的纯CSS圆角代码
- C#中汉字轻松得到拼音全文类
热门文章
- Centos7__Scrapy + Scrapy_redis 用Docker 实现分布式爬虫
- kubeadm部署k8s
- 什么是可变参数?如何创建不可变集合?Steam三类方法是什么?获取流方法特点?流中间方法特点?终结流方法特点?
- java中对list集合中的数据按照某一个属性进行分组
- input输入框输入中文时,监听的input事件 屏蔽拼音状态
- mysql数据库限制多次登录失败,限定用户重试时间
- dede 织梦的安装 出现dir
- 如何使用Pycharm在网页上展示诗歌。(HTML)
- 记一次Goroutine与wg导致的问题
- 【剑指 Offer】03.1.不修改数组找出重复的数字