首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

javascript基础重点

1.在javascript中使用 == 比较,自动转换数据类型再比较,有时候 得到非常诡异的结果;一般情况下使用 === 比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,...,反之不行 如果内部函数和外部函数的变量重名的话,javascript的函数在查找变量时从自身函数定义开始,从内向外查找,如果内部函数定义了与外部函数重名的变量内部函数的变量屏蔽外部函数的变量 10....javascript扫描整个函数体的语句,把所有声明的变量提升到函数顶部,但不会提升变量赋值 11....()JSON格式的字符串变成一个Javascript对象 JSON.parse('[1,2,3,true]'); // [1, 2, 3, true] JSON.parse('{"name":"小明"...如果输出一个键值对象{},可以利用exports这个已存在的空对象{},并继续在上面添加新的键值; 如果输出一个函数或数组,必须直接对module.exports对象赋值

90120

【react】利用shouldComponentUpdate钩子函数优化react性能以及引入immutable库的必要性

凡是参阅过react官方英文文档的童鞋大体上都能知道对于一个组件来说,其state的改变(调用this.setState()方法)以及从父组件接受的props发生变化时,导致组件重渲染,正所谓"学而不思罔...3.如果1,2两种情况下都会导致重渲染,我们该如何避免这种冗余的操作,从而优化性能? 下面我就用实例一一探讨这些问题: 没有导致state的值发生变化的setState是否导致重渲染 ——【!】...对于基本类型变量a和b, b = a 后,访问a,b相当于访问两个不同的变量,两者彼此毫无关联 let a =2,b; b = a;//a的值赋b a = 1;//改变a的值 console.log...('a =' + a);//输出 a = 1 console.log('b =' + b);//输出 b = 2,表明赋值后b,a毫无关联 对于引用类型变量obj1和obj2,obj1 = obj2后,...访问obj1和obj2相当于访问同一个变量,两者形成了一种“耦合”的关系 let obj1 ={name:'李达康'},obj2; obj2 = obj1;//obj1的地址赋obj2 obj1.name

1.3K120
您找到你想要的搜索结果了吗?
是的
没有找到

JavaScript 手写面试题(一)

(timer) // 如果500毫秒内没有再次输入或点击执行定时器里面的方法 // 否则清除定时器重新定时 timer = setTimeout(()=>{ console.log...因为当我们将对象a直接赋值对象b时,由于对象(数组也是一个对象)是引用数据类型,所以把对象a赋值对象b时,变量a仅仅是对这个对象的引用,它们指向同一个引用地址,所以在修改a的值时b的值也会发生变化,...即: const a = { k1: 1, k2: 2 } // a 直接赋值 b ===> 浅拷贝 const b = a a.k1 = 5 console.log(a) //...a 直接赋值 b ===> 浅拷贝 const b = JSON.parse(JSON.stringify(a)) a.k1 = 5 console.log(a) // {k1: 5, k2: 2}...console.log(b) // {k1: 1, k2: 2} 先通过 a 对象通过 JSON.stringify 将其转换成字符串,因为字符串是基本数据类型,所以可以直接赋值,然后在使用 JSON.parse

29010

Vue的computed和watch的细节全面分析

,因为对应的computed作为计算属性定义fullName并返回对应的结果这个变量,变量不可被重复定义和赋值 ?...常见错误1 传入的值想作为局部变量来使用,直接使用 props:['listShop'], data(){ return{} }, created(){...3.4 存在的问题 复杂数据类型在栈中存贮的是指针,所以赋值新的变量也会改变原始的变量值.那么应该咋整呢?...,就是简单数据类型赋值,再用JSON.parse转化 3.5 解决方案2 直接用computed改变 computed:{ listShopChild(){ return this.listShop...$set(arr,1,true)对应的值耶不更新, 这个很坑,这个bug我找个很久 如果传入的值只是在data定义,并未在methods或生命周期钩子更改,直接改变也会报错 所以还是可以先用局部变量接收

1.8K20

ES6 学习笔记(二)解构赋值

let [x = 1] = [undefined]; let [y = 1] = [null]; console.log(x, y)// x=1 y=null 3、如果默认值是一个表达式,采用惰性求值...} = {foo:'aaa', bar:'bbb'}; console.log(baz)// aaa 4、对象解构赋值内部机制是先找到同名属性,然后再赋值对应的变量,真正被赋值的是后者 let { bar...如: let x; ({ x } = { x: 1 }); console.log(x) // 1 5、对象解构赋值可以很方便地现有对象的方法赋值某个变量。..., 3 ] 三、字符串的解构赋值 1、字符串的解构赋值字符串看作一个类似于数组的对象。...let { length: len } = 'hello'; console.log(len) // 5 四、数值和布尔值的解构赋值 1、解构赋值的原则是,如果等号右边不是对象,先转换为对象 let

28310

JavaScript之深拷贝和浅拷贝

如果你对拷贝原理理解的不透彻,此文或许能提供一点帮助。...javascript数据类型 基本数据类型 string、number、null、undefined、boolean、symbol(ES6新增) 变量值存放在栈内存中,可直接访问和修改变量的值 基本数据类型不存在拷贝...可以看到数组a直接赋值b,a、b引用的其实是一个对象地址,只要地址值发生变化,a、b栈内存指针指向的堆地址也会发生变化,这种引用拷贝只是新增了一个变量栈内存的指针,意义不大 数组的concat、slice...可以再加一次判断,对象的属性如果引用对象指针跳出当前循环。 深拷贝 深拷贝是可以完美的解决浅拷贝的弊端,重新开辟一块地址,深拷贝出来的属性的基本类型值都是相同的。...JSON内置对象深拷贝 JSON 对象是ES5中引入的新的类型(支持的浏览器为IE8+),JSON对象parse方法可以JSON字符串反序列化成JS对象,stringify方法可以JS对象序列化成

50510

引用类型、对象拷贝

false // 因为对象比较的是两个地址,两个对象的地址不同 console.log(obj1 = obj2); // Object {a: 1, b: 2} // 因为把 obj2 的地址赋了...// 引用类型赋值完后互相关联,指向同一个对象 (3) 如下代码输出什么?...1 // 因为函数的形参和实参(在这里n是形参,a是实参),是两个变量如果传递进去的实参保存的是基本类型,形参和外面的变量保存的基本类型的值,互相独立,互不影响 console.log...(c) // 输出 Object {name: 'jirengu', age: 3} // 因为函数的形参和实参,是两个变量如果传递进去的实参保存的是引用类型,形参改变,外面的变量保存着的对象也随之改变...() JSON.parse(JSON.stringify(obj)) function copy(obj){ var newObj = JSON.parse(JSON.stringify

73060

写个JS深拷贝,面试备用_2023-03-13

简单的总结下,假设有个A,我们拷贝了一个为B,就是修改A或者B的时候看看另一个会不会也变化,如果改变A的值B也变了那么就是浅拷贝,如果改变A之后B的值没有发生变化就是深拷贝,当然这是基础理解,下面我们一起来分析下吧...先不管这个方法具体干嘛,我们先来看看结果,我们发现拷贝一个A之后的B改变了name、age、sex之后A的值并没有发生变化,在这里,你可能会想,这不是就成功了么,AB宜家互相不影响了,可是和我们上面讲的浅拷贝...如果obj里面有时间对象,JSON.stringify后再JSON.parse的结果,时间只是字符串的形式。...而不是时间对象; 如果obj里有RegExp、Error对象,序列化的结果只得到空对象; 如果obj里有函数,undefined,序列化的结果会把函数或 undefined丢失; 如果obj里有NaN...、Infinity和-Infinity,序列化的结果变成null JSON.stringify()只能序列化对象的可枚举的自有属性,例如 如果obj中的对象是有构造函数生成的, 使用这个方法后会丢弃对象的

99430

写个JS深拷贝,面试备用

简单的总结下,假设有个A,我们拷贝了一个为B,就是修改A或者B的时候看看另一个会不会也变化,如果改变A的值B也变了那么就是浅拷贝,如果改变A之后B的值没有发生变化就是深拷贝,当然这是基础理解,下面我们一起来分析下吧...先不管这个方法具体干嘛,我们先来看看结果,我们发现拷贝一个A之后的B改变了name、age、sex之后A的值并没有发生变化,在这里,你可能会想,这不是就成功了么,AB宜家互相不影响了,可是和我们上面讲的浅拷贝...如果obj里面有时间对象,JSON.stringify后再JSON.parse的结果,时间只是字符串的形式。...而不是时间对象;如果obj里有RegExp、Error对象,序列化的结果只得到空对象;如果obj里有函数,undefined,序列化的结果会把函数或 undefined丢失;如果obj里有NaN、...Infinity和-Infinity,序列化的结果变成nullJSON.stringify()只能序列化对象的可枚举的自有属性,例如 如果obj中的对象是有构造函数生成的, 使用这个方法后会丢弃对象的

81930

Javascript中如何实现对象的深拷贝 (前端高频面试题)

如果一个变量绑定到一个非基本数据类型(Array, Function, Object),那么它只记录了一个内存地址,该地址存放了具体的数据。...因此,如果两个变量指向相同的对象,返回true。 什么是拷贝?...' a.name //'卡卡罗特' 上面代码原始对象拷贝到一个空对象,就得到了原始对象的克隆,这时候a与b指向的是不同的栈对象,所以对b.name重新复制也不会影响到a.name。...但是如果a.name是一个对象的引用,而不是一个字符串,那么上面的代码也遇到一些问题,参考如下代码: var a = {name:{firstName:'卡卡罗特',lastName:'孙悟空'}}...a.name.firstName 因为Object.assign()方法只是浅层拷贝,a.name是一个栈对象的引用,赋值b时,b.name也同样是这个栈对象的引用 在很多情况下我们只是想获得一个独立的

85910

go的return和defer

: 原因是: 函数调用的执行步骤为: 调用函数->设定返回值result->赋值result=1->准备return,return的值为resulr->执行defer赋值为2->return执行完毕,...: 原因是: return的调用并非原子性的,分为2个步骤:1 确定返回值,2正式返回 在确定返回值之后,会去执行defer方法,如果defer返回值变更,返回时数据也变更....在此示例中,returni赋值了result,这个时候result=1,同时result又更改成了2,所以为2 总结 规则一:延迟函数的参数在声明时就确定下来了 defer函数在声明时就已经确定好了参数...fmt.Println(i)    }()    return i } 该情况下,defer可以引用到i的变量值,进行一次值拷贝,所以defer操作的是拷贝后的i值,不会发生变化(如果返回变量类型为指针类型...,则会发生变化) 本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

27220

javascript 拷贝赋值

这里我们深入探讨JavaScript中的对象赋值和拷贝相关的知识,帮助开发者更好地理解和使用对象的赋值操作。对象赋值 vs....对象拷贝首先,让我们明确对象赋值和对象拷贝的概念:对象赋值(Assignment):对象赋值是指一个对象的引用赋另一个变量,这两个变量指向同一个内存地址,它们实际上指向同一个对象。...31在这个示例中,obj2通过对象赋值指向了obj1,所以修改obj2的属性影响到obj1,因为它们指向同一个对象。...以下是在JavaScript中进行拷贝赋值时需要注意的几点:浅拷贝与深拷贝浅拷贝: 浅拷贝创建一个新对象,但只复制原始对象的引用,而不是其内容。...如果原始对象包含引用类型(如对象、数组),新对象和原始对象仍然共享这些引用类型的数据。浅拷贝可以使用扩展运算符、Object.assign()等方法实现。

13910

小邵教你玩转ES6(一)-let,const和解构赋值

{ var str 1 = 'hello swr' } console.log(str1) // 打印输出 hello swr // 2.let // 2.1 不存在变量作用域提升,这样可以避免了我们还没声明变量就拿变量来用...// 2.2 同一作用域的同一个变量不能够重复声明,避免我们重复声明变量 // 2.3 let声明的变量不会到全局上 // 2.4 let和代码块{}结合使用形成块级作用域 // 2.1 // console.log...console.log(c) // [0,1,2,3,4,5] let d = [...a,...b] console.log(d) // [0,1,2,3,4,5] // 数组的克隆 // 假如我们简单地把一个数组赋值另外一个变量...== 'object'){ // 是否为对象 toObj[key] = fromObj[key] // 如果为普通值,直接赋值 }else{ toObj[key] =...new fromObj[key].constructor // 如果为object,new这个object指向的构造函数 deepCopy(fromObj[key],toObj[key])

60810

JS基础知识总结(二):浅拷贝与深拷贝

上一篇JS基础知识总结(一)主要了介绍变量类型相关的基础知识,本文介绍JS的深拷贝和浅拷贝的有关内容。 1.基本概念 (1)深拷贝和浅拷贝针对的是引用类型。...Object.assign()只会拷贝所有的属性值到新的对象中,如果属性值是基本类型,修改其中一个对象,不会影响另一个。而如果属性值是对象的话,拷贝的是对象的引用,而不是对象本身。...也就是说,如果引用的对象被修改,更改对于新数组和原始数组都是可见的。这包括也是数组的数组参数的元素。...如果被引用的对象发生改变,新的和原来的数组中的这个元素也会发生改变。...console.log('iniObj', iniObj); console.log('newObj', newObj) 结果: setTo.png 说明把一个对象赋值另一个变量

2.8K361

js对象的直接赋值、浅拷贝与深拷贝

直接this.ruleForm赋值一个变量object,然后每次再push进this.tableData里,这样看上去逻辑似乎也没啥毛病,但是,这样就会产生一个神奇的现象:每次填写表单中的数据的时候...刚开始的时候personCopy的name属性赋值小刚,发现,person也发生了改变。personCopy的对象属性ageAndSex的age属性赋值17,person也发生了改变。...有一种非常简单的方法就是序列化成为一个JSON字符串,将对象的内容转换成字符串的形式,再用JSON.parse()反序列化JSON字符串变成一个新的对象,这样原对象就与复制后的新对象没了必然的关系。...或是含有RegExp对象,JSON.stringify()会将其变为空对象,属性中含有NaN、Infinity和**-Infinity**,序列化的结果变成null,如果属性中有函数,undefined...,symbol经过JSON.stringify()序列化后的JSON字符串中这个键值对消失,因为不支持。

4.3K20
领券