前端面试准备笔记之JavaScript(01)
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后台自动调用,并不出现在代码中。
前端面试准备笔记之JavaScript(01)的更多相关文章
- 前端面试准备笔记之JavaScript(03)
01. 变量声明提升 在预解析的时候,成员变量和函数,被提升到最高的位置,方便其他程序访问. 可以先使用后声明. 只提升变量名,不提升变量值 let const 声明的变量不具有变量声明提升. // ...
- 前端面试准备笔记之JavaScript(02)
01. this的典型应用场景 this在各个场景中取什么值,是在函数执行的时候确认的,不是在定义的时候确认的. 普通函数执行 返回window function fn1() { console.lo ...
- 前端面试准备笔记之JavaScript(04)
01. DOM的本质 xml是一种可扩展的标记性语言,可扩展就是可以描述任何结构的数据,他是一棵树,可以自定义标签,可以自己扩展. html也是一种特定的xml,他规定了一些标签的名称,结构与xml是 ...
- 前端面试知识点集锦(JavaScript篇)
目录 1.谈谈你对Ajax的理解?(概念.特点.作用) 2.说说你对延迟对象deferred的理解? 3.什么是跨域,如何实现跨域访问? 4.为什么要使用模板引擎? 5.JavaScript是一门什么 ...
- 问得最多的十个JavaScript前端面试问题
我知道有很多人不同意这种类型的面试.其实不管你喜不喜欢,你都得接受.尤其当你是自学的,而且要申请第一份工作时. 我估计很多有人其它方法来证明他自己,像Github/ 项目地址可能是非常理想的证明方 ...
- web前端面试试题总结---javascript篇
JavaScript 介绍js的基本数据类型. Undefined.Null.Boolean.Number.String. ECMAScript 2015 新增:Symbol(创建后独一无二且不可变的 ...
- 前端面试之JavaScript的基本数据类型!
前端面试之JavaScript的基本数据类型! JS的基本数据类型 数字 字符串 布尔值 JavaScript中有两个特殊的原始值: null (空) 和undefined (未定义), , 它们不是 ...
- 前端面试之JavaScript中数组的方法!【残缺版!!】
前端面试之JavaScript中数组常用的方法 7 join Array.join()方法将数组中所有元素都转化为字符串并连接在-起,返回最后生成的字 符串.可以指定一个可选的字符串在生成的字符串中来 ...
- 前端面试之JavaScript中的闭包!
前端面试之JavaScript中的闭包! 闭包 闭包( closure )指有权访问另一个函数作用域中变量的函数. ----- JavaScript 高级程序设计 闭包其实可以理解为是一个函数 简单理 ...
随机推荐
- python线性回归
一.理论基础 1.回归公式 对于单元的线性回归,我们有:f(x) = kx + b 的方程(k代表权重,b代表截距). 对于多元线性回归,我们有: 或者为了简化,干脆将b视为k0·x0,,其中k0为1 ...
- Python-其他-round()保留小数位时遇到的问题
最近有一个需求,原有整数计算,改成小数计算,保留一位小数. 于是按照需求,将数据结构由 int 改为 float ,计算时采用round()方法来保留小数位. 第一版代码如下: a = 0.10000 ...
- linux目录和Windows目录对比
linux目录和Windows目录对比 我们应该知道 Windows 有一个默认的安装目录专门用来安装软件.Linux 的软件安装目录也应该是有讲究的,遵循这一点,对后期的管理和维护也是有帮助的. / ...
- [PASECA2019]honey_shop writeup
这是PASECA2019的一道web题 前端是一个蜂蜜商店,你有$1336,可以买蜂蜜和flag.但是flag要$1337,所以我们只能买蜂蜜. 一般这种题目的常规操作就是通过修改你的钱使你能够买到f ...
- 修改oracle监听占用8080端口号的问题
前期: 先确认Oracle已经安装并正常运行 输入lsnrctl start 启动 Oracle 输入lsnrctl status 查看Oracle运行状态 可以看到第二个PORT = 8081 是我 ...
- java中使用IO流将以文件中的内容去取到指定的文件中
public class Demo12 { public static void main(String[] args) throws IOException { File file=new File ...
- jsp中将一个jsp引入另一个jsp指定位置
<jsp:include page="badSurveyUpdate.jsp"/>
- react项目中登陆注册验证码的倒计时,页面刷新不会重置
目前很多的网站和app在做登陆注册时都会用到手机验证码,为了防止验证码轰炸,也就是随意的点击验证码,一般我们需要对获取验证码进行一些限制,最常用到的是在规定时间内不得重复发送. 实现倒计时很简单,可以 ...
- java注解学习笔记总结
注解的理解 ① jdk 5.0 新增的功能 ② Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理.通过使用 Annotation,程序 ...
- Ubuntu无法ssh远程连接问题 (转)
[系统]Ubuntu 12.04 server [问题描述]新安装的Ubuntu系统无法直接通过ssh远程连接. [解决办法] 新安装的Ubuntu系统并未安装ssh-server服务,需要自行安装, ...