前端面试题(第三弹)——js对象的基本方法和深浅拷贝

这篇具有很好参考价值的文章主要介绍了前端面试题(第三弹)——js对象的基本方法和深浅拷贝。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、 js对象(object)

1.创建对象的两种方式

第一种

let person = new Object();
person.name = "dabing";
person.age = 23;
person.sayName = function () {
	console.log(this.name)
}

第二种

let person = {
   name:"xiaowang",
   age:22,
   sayName () {
   console.log(this.name)
  }
}

2. 对象属性的类型

1.configurable:属性是否可以通过delete删除,默认值为true。
2.enumberable:属性是否可以通过for in 进行循环返回,默认值为true。
3.writable:属性是否可被修改,默认值为true。
4.value:属性实际的值,默认为undefined。

//要修改属性的默认特性,就必须使用Object.defineProperty()方法
let person = {}
Object.defineProperty(person, "name", {
	writable: false,     //设置person的name属性不可修改
	value:"xiaowang"
})

// defineProperty()  方法接受三个参数 第一个是要修改的对象,第二个是对象的属性,
//                   最后一个参数是一个对象里面包含了
//                   四个属性configurable、enumberable、writable、value
                
console.log(person.name);   //"xiaowang"
person.name = "dabing"
console.log(person.name)  //"xiaowang"

3. 访问器属性

访问器属性有四个属性类型,也是使用Object.defineProperty() 进行定义修改,
1.configurable:属性是否可以通过delete删除,默认值为true。
2.enumberable:属性是否可以通过for in 进行循环返回,默认值为true。
3.get(){}; 读取属性,默认undefined。
4.set(){}; 设置属性,默认undefined。

访问器属性对于没有接触过的人来说有点难理解,怎么区分数据属性与访问器属性呢?

如下例子,我们一般在设置访问器属性的时候,会给属性在前面或者后面加上下划线(属于是约定俗成),以表示私有变量,在js中这是伪私有。
设置完伪私有变量之后,一般情况下我们是不希望直接访问这个属性的,所以我们给book再定义一个“year”,我们会直接访问这个year ,这个year就是访问器属性,而不是去访问_year,
在通过Object.defineProperty()方法中,设置get、set也不是必要的。可以根据实际场景进行调整。

let book = {
  _year:2017,
  edition: 1
}

Object.defineProperty(book, "year", {
    get() {
    	return this._year;
    }set(newValue) {
       if(newValue > 2017) {
			this._year = newValue;
			this.eidtion += newValue - 2017;
       }
    }
})
book.year = 2018
console.log(book.edition)  //2

//另外有定义多个属性的方法Object.defineProperties({

	year_:{
    value:2017
   },
	edition:{
    value:1
    },
    year:{
	get() {
	 return this.year_;
	}, 
	set(newValue) {
       if(newValue > 2017) {
			this._year = newValue;
			this.eidtion += newValue - 2017;
       }
	}
})
//读取属性的特性的方法Object.getOwnPropertyDescriptor(对象,属性)
//访问对象所有属性特性的方法Object.getOwnPropertyDescriptors(对象)

二、基本类型和引用类型

基本类型的数据包括number、string、boolean、null、undefined ———基本数据类型是值传递
引用数据类型 Object {} 、[] 、function(){} 、Date 、RegExp ———引用数据类型是地址传递

var number = 23
var a = number
a = 20
console.log(number+a)    //43  栈内存  会开辟新地址

var obj ={ 
	name:"xiaowang",
	age:23
}
var b = obj;
b.name = "dabing"
console.log(obj)  //{name: 'dabing', age: 23}  堆内存 b会指向obj的内存地址 修改的是同一个对象

三、 深浅拷贝

1. 深浅拷贝定义解释

深浅拷贝就像上面举的例子一样,浅拷贝就是指Object的直接复制,修改一个值另一个也跟着变化,两个指向同一个内存地址,深拷贝指的是我们对于Object的拷贝,可以实现两个对象互不影响,像基本数据类型那样。

2. 实现深拷贝的方法

> JSON.parse(JSON.stringify(obj))

obj = {name:"aa"}
var b = JSON.parse(JSON.stringify(obj))
b.name = "bb"
console.log(obj)    // {name: 'aa'}
console.log(b)      // {name: 'bb'}

!!!注意:

JSON.parse(JSON.stringify(obj)) 是最简单的实现方式,但是有一些缺陷:
对象的属性值是函数时,无法拷贝。
原型链上的属性无法拷贝
不能正确的处理 Date 类型的数据
不能处理 RegExp
会忽略 symbol
会忽略 undefined
文章来源地址https://www.toymoban.com/news/detail-537018.html

> 实现一个 deepClone 函数 (深拷贝,递归)

function deepClone (obj) {
	if(typeof obj != 'object') {
		return obj
	}
	let newObj = obj.constructor === Array ? [] : {}
	for (let i in obj ) {
		if(obj[i] instanceof Object) {
		     newObj[i] = deepClone(obj[i])
		}else{
		     newObj[i] = obj[i];
		}
	}
	return newObj;
}
var obj = {name:"wang ",age:22}
var obj2= deepClone(obj)
obj2.name = "bing"
console.log(obj2)    //  {name: 'bing', age: 22}

到了这里,关于前端面试题(第三弹)——js对象的基本方法和深浅拷贝的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据库基础面试第三弹

    1. MyISAM: MyISAM是MySQL最早的数据库引擎之一。它被设计成处理大量的插入和查询操作。MyISAM表格的数据存储在三个文件上:.frm文件存储表结构,.MYD文件存储数据,.MYI文件存储索引。 MyISAM表格不支持事务处理和崩溃恢复 ,因此在并发写入操作和故障发生时可能会导致数据不

    2024年02月09日
    浏览(42)
  • 计算机网络 基础面试第三弹

    短连接: 短连接是指每次客户端请求与服务器响应完成后,连接就会关闭。也就是说,每次请求都需要重新建立连接,完成一次请求后立即关闭连接。这意味着每个HTTP请求都需要经历连接建立、数据传输和连接关闭的过程。 短连接的特点包括: 每个请求都需要建立和关闭连

    2024年02月08日
    浏览(49)
  • C++ 第三弹继承和多态-类和对象

    目录 1.继承 1.1什么是继承? 1.2语法格式 1.3继承权限 1.4继承概念语法格式 1.5赋值兼容规则 1.6继承体系中的作用域 1.7在继承体系中的构造和析构 1.8静态成员继承 1.9友元的继承 1.10不同继承方式下子类的对象模型 1.11继承和组合 2.多态 2.1什么是多态 2.2多态的分类 2.3实现条件

    2024年02月10日
    浏览(33)
  • C++初阶学习第三弹——类与对象(上)——初始类与对象

    前言: 在前面,我们已经初步学习了C++的一些基本语法,比如内敛函数、函数重载、缺省参数、引用等等,接下来我们就将正式步入C++的神圣殿堂,首先,先给你找个对象 目录 一、类与对象是什么? 二、类的各部分组成 1、类的定义 2、类的访问限定符及封装 3、类的作用域

    2024年04月26日
    浏览(50)
  • 深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作

    二叉树(1): 深入理解数据结构第一弹——二叉树(1)——堆-CSDN博客 二叉树(2): 深入理解数据结构第二弹——二叉树(2)——堆排序及其时间复杂度-CSDN博客 前言: 在前面我们讲了堆及其应用,帮助我们初步了解了二叉树的一些原理,但那与真正的二叉树仍有不同,

    2024年04月09日
    浏览(49)
  • 前端面试的话术集锦第 5 篇:高频考点( 类型转换 & 深浅拷贝 & 模块化机制等)

    这是记录 前端面试的话术集锦第五篇博文——高频考点(类型转换 深浅拷贝 模块化机制等) ,我会不断更新该博文。❗❗❗ typeof 对于原始类型来说,除了 null 都可以显示正确的类型:

    2024年02月09日
    浏览(66)
  • 前端开发:JS中向对象中添加对象的方法

    在JS中向对象中添加对象的操作方法大概有三种:直接添加、使用扩展运算符…、 Object.assign()方法。 1、直接添加 直接在对象A中添加需要的键值对内容,具体示例如下所示: 2、使用扩展运算符… 使用扩展运算符…实现对象中添加对象是比较常用的方式,具体示例如下所示:

    2024年02月11日
    浏览(55)
  • 前端基础面试题:如何判断对象是否具有某属性?遍历数组的方法有哪些?

    一、如何判断对象具有某属性? 如: let obj={name:\\\'zhangsan\\\',age:21} 有以下方法 ( property 为属性名的变量,实际上是key,键名): 1. property in obj 效果如图: in 运算符 2. Reflect.has(obj, property) 效果如图: 关于 Reflect: ① 它是JS的一个内置对象,无构造函数,可以用它遍历对象的key,如

    2023年04月08日
    浏览(61)
  • web前端面试-- js深拷贝的一些bug,特殊对象属性(RegExp,Date,Error,Symbol,Function)处理,循环引用weekmap处理

    本人是一个web前端开发工程师,主要是vue框架,整理了一些面试题,今后也会一直更新,有好题目的同学欢迎评论区分享 ;-) web面试题专栏:点击此处 在JavaScript中,深拷贝和浅拷贝是两种不同的对象复制方式。 浅拷贝是指将一个对象的引用复制给另一个对象,这意味着两个

    2024年02月07日
    浏览(45)
  • 自动化测试工具Selenium的基本使用方法,面试字节跳动的前端工程师该怎么准备

    8.小结 上述均可以改写成find_element(By.ID,‘kw’)的形式 find_elements_by_xxx的形式是查找到多个元素,结果为列表 import time from selenium import webdriver#驱动浏览器 from selenium.webdriver import ActionChains #滑动 from selenium.webdriver.common.by import By #选择器 from selenium.webdriver.common.by import By #按照什

    2024年04月16日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包