ECMAScript 6介绍了该let
声明.我听说它被描述为"本地"变量,但我仍然不太确定它与var
关键字的行为有何不同.
有什么区别?何时应该let
使用var
?
主持人注意:请拒绝编辑代码或删除此通知的冲动.空白模式可能是问题的一部分,因此不应该被不必要地篡改.如果你在"空白是微不足道的"阵营,你应该能够接受原样.
是否有可能在JavaScript中(a== 1 && a ==2 && a==3)
进行评估true
?
这是一家大型科技公司提出的面试问题.它发生在两周前,但我仍在努力寻找答案.我知道我们从来没有在日常工作中写过这样的代码,但我很好奇.
在我正在合作的项目中,我们有两种选择,我们可以使用哪个模块系统:
require
和导出模块,并使用module.exports
和导出exports.foo
.import
,并使用ES6导出export
使用一个优于另一个是否有任何性能优势?如果我们使用ES6模块而不是Node模块,还有什么我们应该知道的吗?
这似乎是显而易见的,但我发现自己对于何时使用花括号在ES6中导入单个模块感到困惑.例如,在我正在处理的React-Native项目中,我有以下文件及其内容:
initialState.jsvar initialState = {
todo: {
todos: [
{id: 1, task: 'Finish Coding', completed: false},
{id: 2, task: 'Do Laundry', completed: false},
{id: 2, task: 'Shopping Groceries', completed: false},
]
}
};
export default initialState;
Run Code Online (Sandbox Code Playgroud)
在TodoReducer.js中,我必须在没有花括号的情况下导入它:
import initialState from './todoInitialState';
Run Code Online (Sandbox Code Playgroud)
如果我initialState
用大括号括起来,我会得到以下代码行的错误:
TodoReducer.js:无法读取未定义的属性待办事项
export default function todos(state = initialState.todo, action) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
使用花括号的组件也会发生类似的错误.我想知道何时应该使用大括号进行单次导入,因为很明显,当导入多个组件/模块时,你必须将它们用大括号括起来,我知道.
编辑:
所谓张贴在这里并没有回答我的问题,而不是我问的时候我应不应该用花括号用于导入单个模块,或者我不应该用花括号中ES6导入单个模块(这显然不是例如,我已经看过需要花括号的单个导入)
当从箭头函数返回一个对象时,由于语法的模糊性,似乎有必要使用额外的一组{}
和一个return
关键字.
这意味着我不能写p => {foo: "bar"}
,但必须写p => { return {foo: "bar"}; }
.
如果箭头函数返回除对象以外的任何内容{}
,return
则不需要,例如:p => "foo"
.
p => {foo: "bar"}
回报undefined
.
修改后的p => {"foo": "bar"}
抛出" SyntaxError
:意外标记:' :
'".
有什么明显的东西我不见了吗?
// Build out our basic SafeString type
function SafeString(string) {
this.string = string;
}
SafeString.prototype.toString = function() {
return "" + this.string;
};
export default SafeString;
Run Code Online (Sandbox Code Playgroud)
我以前从未见过export default
.有没有相同的东西export default
可以更容易理解?
何时重要的props
是super()
,为什么?
class MyComponent extends React.Component {
constructor(props) {
super(); // or super(props) ?
}
}
Run Code Online (Sandbox Code Playgroud) 目前在ES5中,我们很多人在框架中使用以下模式来创建类和类变量,这很舒服:
// ES 5
FrameWork.Class({
variable: 'string',
variable2: true,
init: function(){
},
addItem: function(){
}
});
Run Code Online (Sandbox Code Playgroud)
在ES6中,您可以本机创建类,但没有选项可以使用类变量:
// ES6
class MyClass {
const MY_CONST = 'string'; // <-- this is not possible in ES6
constructor(){
this.MY_CONST;
}
}
Run Code Online (Sandbox Code Playgroud)
遗憾的是,上面的代码不起作用,因为类只能包含方法.
我知道我可以this.myVar = true
在constructor
...但我不想"垃圾"我的构造,特别是当我有一个更大的类20-30 +参数.
我正在考虑处理这个问题的许多方法,但还没有找到任何好的方法.(例如:创建一个ClassConfig
处理程序,并传递一个parameter
与该类分开声明的对象.然后处理程序将附加到该类.我正在考虑WeakMaps
以某种方式集成.)
你有什么样的想法来处理这种情况?
规范问题如果在用箭头函数替换函数声明/表达式后发现有关问题的问题,请将其作为此副本的副本关闭.
ES2015中的箭头功能提供了更简洁的语法.我现在可以用箭头功能替换所有函数声明/表达式吗?我需要注意什么?
例子:
构造函数
function User(name) {
this.name = name;
}
// vs
const User = name => {
this.name = name;
};
Run Code Online (Sandbox Code Playgroud)
原型方法
User.prototype.getName = function() {
return this.name;
};
// vs
User.prototype.getName = () => this.name;
Run Code Online (Sandbox Code Playgroud)
对象(文字)方法
const obj = {
getName: function() {
// ...
}
};
// vs
const obj = {
getName: () => {
// ...
}
};
Run Code Online (Sandbox Code Playgroud)
回调
setTimeout(function() {
// ...
}, 500);
// vs
setTimeout(() => {
// ...
}, …
Run Code Online (Sandbox Code Playgroud) 我知道>=
运算符意味着大于或等于,但我=>
在一些源代码中看到过.那个运营商的意义是什么?
这是代码:
promiseTargetFile(fpParams, aSkipPrompt, relatedURI).then(aDialogAccepted => {
if (!aDialogAccepted)
return;
saveAsType = fpParams.saveAsType;
file = fpParams.file;
continueSave();
}).then(null, Components.utils.reportError);
Run Code Online (Sandbox Code Playgroud)