克隆JavaScript对象的最有效方法是什么?我已经看到obj = eval(uneval(o));被使用,但这是非标准的,只有Firefox支持.
我做过类似的事情,obj = JSON.parse(JSON.stringify(o));但质疑效率.
我也看到了具有各种缺陷的递归复制功能.
我很惊讶没有规范的解决方案.
原始类型(Number,String等)按值传递,但是对象是未知的,因为它们可以是值传递(如果我们认为持有对象的变量实际上是对象的引用)并且通过引用传递(当我们认为对象的变量保存对象本身时).
虽然最后并不重要,但我想知道提交传递约定的参数的正确方法是什么.是否有JavaScript规范的摘录,它定义了与此相关的语义?
我在Github前端访谈问题集中遇到了这个问题:
Run Code Online (Sandbox Code Playgroud)var foo = {n: 1}; var bar = foo; foo.x = foo = {n: 2};问题:foo.x的价值是多少?
答案是undefined.
我做了一些研究,我明白这个问题是(如果我错了,请纠正我):
var foo = {n: 1};声明一个foo属性n等于1 的对象.var bar = foo;声明了一个bar引用相同对象的对象foo.foo.x = foo = {n: 2}; 我认为这等于 foo.x = (foo = {n: 2});foo.x平等undefined.但是,值bar.x是对象{n:2}.如果bar和foo是指同一个对象,为什么bar.x得到的价值,同时foo.x为undefined?真正发生了foo.x = foo = {n: 2}; …
我读了一本名为"面向Web开发人员的专业Javascript"的书,它说:"变量由参考值或原始值指定.参考值是存储在内存中的对象".然后它没有说明如何存储原始值.所以我猜它没有存储在内存中.基于此,当我有这样的脚本:
var foo = 123;
Run Code Online (Sandbox Code Playgroud)
Javascript如何记住foo变量供以后使用?
假设您有以下复杂对象:
var object1 = .... // (something complexed)
Run Code Online (Sandbox Code Playgroud)
这会占用xJS应用程序中的内存量.现在假设您有一些其他参考对象object1:
var otherObject = { something: true, value: 'yes', object: object1 };
var anotherObject = { color: '#FFF', object: object1 };
Run Code Online (Sandbox Code Playgroud)
我object1最初占用的内存量是否增加了两倍?或者引用object1不添加内存开销?
我不确定如何自己测试以确定答案.(如果你可以告诉我如何指向一个有助于对此进行基准测试的工具,那么可以获得奖励积分).
JavaScript中空对象的内存占用量是多少?如果使用对象文字语法创建对象:
let emptyObj = {};
Run Code Online (Sandbox Code Playgroud)
在谷歌Chrome开发者工具(配置文件选项卡)中,拍摄快照后,它显示浅尺寸和保留尺寸等于56字节.此外,如果通过以下方式创建对象,则会出现相同的大小:
let emptyObj = Object.create(null);
Run Code Online (Sandbox Code Playgroud)
对我来说,这太过分了,因为我在代码执行期间创建了很多对象(不一定是空的,但主要是只有很少的属性),我必须将它们存储在内存中.我假设如果可以减少空对象大小,也可以通过相同数量的字节减少具有属性的对象的大小.
例如,如果object看起来像这样:
let foo = {bar: 4};
Run Code Online (Sandbox Code Playgroud)
它的大小,比方说,56(空对象开销)+ 6(密钥)+ 8(值)= 70字节,然后将空对象的大小减少40个字节将导致foo的大小为30字节(16 + 6 + 8).
这是对Chrome空对象大小的正确解释吗?是否可以减少它?它会导致非空对象的大小减小吗?
我正在使用带有vuex的vuejs使用项目的应用程序,每个项目都有一个或多个作业.
我可以添加,删除和更新作业.添加和删除工作正常,但更新不是.
vuex开发工具中的状态:
我的HTML:
<div class="job-compact row" v-for="(job, index) in project.jobs">
<div class="col-md-6">
<div class="form-group" :class="{'has-error' : errors.has('jobs.' + index + '.function')}">
<input type="text" name="jobs[function][]" class="form-control" v-model="job.function" @change="updateJobValue(index, 'function', $event.target.value)"/>
</div>
</div>
<div class="col-md-4">
<div class="form-group" :class="{'has-error' : errors.has('jobs.' + index + '.profiles')}">
<input type="number" name="jobs[profiles][]" class="form-control" v-model="job.profiles" @change="updateJobValue(index, 'profiles', $event.target.value)"/>
</div>
</div>
<div class="col-md-2">
<button v-if="index == 0" class="btn btn-success btn-sm" @click="addJob"><i class="fa fa-plus"></i></button>
<button v-if="index > 0" class="btn btn-danger btn-sm" @click="deleteJob(index);"><i class="fa fa-minus"></i></button>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我有一个v-for显示我所有工作的东西.在我的作业中编辑值时,我使用该 …
我在某处创建了一个函数并将其绑定到this我可以使用父块的含义this作为this函数内的值.例如:
var foo = function() {
// some stuff involving other stuff
}.bind(this);
Run Code Online (Sandbox Code Playgroud)
是this我作为参数传递给bind按引用传递,或价值?因此,如果我this稍后在外部代码块中更改对象的参数,然后调用foo,将foo使用this我调用时的值bind,还是在我调用的时候foo?
JavaScript语言是通过引用传递还是按值传递语言?
对于对象的原始类型Vs也是不同的吗?
我有这个切片:
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import { IAuthState } from '../../types';
const initialState: IAuthState = {
isAuthenticated: false,
profile: null,
};
export const authSlice = createSlice({
name: 'auth',
initialState,
reducers: {
setAuthState(state, { payload }: PayloadAction<IAuthState>) {
console.log({ payload });
state = payload;
},
},
});
export const { setAuthState } = authSlice.actions;
export const authReducer = authSlice.reducer;
Run Code Online (Sandbox Code Playgroud)
这是标准的样板切片。
问题是,如果我这样做,我的状态不会更新。Redux devtools 说没有变化。我的有效负载是这样的:
{
isAuthenticated: true,
profile: {...} // big object
}
Run Code Online (Sandbox Code Playgroud)
但如果我这样分配:
reducers: {
setAuthState(state, { payload …Run Code Online (Sandbox Code Playgroud)