我从一个猫鼬查询中得到一个结果(该对象),并希望在我对该对象进行字符串化并将其发送到客户端之前替换/删除一些键.
当我在console.log对象时,一切都很好(列出所有键,仅此而已).当我在对象上执行for..in时,隐藏的字段突然冒出(并且感兴趣的键,不要).它们有意义 - 它们属于猫鼬 - 但我不想要它们.同样的事情发生,当在Object - hidden字段弹出窗口上使用Object.keys或Object.getOwnPropertyNames时,没有用.
所以我想用util.inspect(obj,true,null,true)检查元素,并将结果记录到控制台.控制台上的结果是一样的,好像我在没有检查的情况下直接记录对象.
现在,有两个问题;
//编辑
好,我知道了.经过一些调查,我意识到,mongoose对象代理其属性并具有toJSON函数,这解释了为什么console.logs处于预期的输出结构中.解决方案是使用Mongoose自己的toObject方法;
mongooseObj.toObject({ getters: true, virtuals: false })
Run Code Online (Sandbox Code Playgroud)
这样,我可以迭代Object.getOwnPropertyNames并替换/删除我不希望客户端知道的键!
看看对象内部的新观察ES6特征,我想知道Ember和ES6是等价还是不同?我们可以安全地使用Watchjs polyfill with ember吗?
我正在使用grunt-express进行本地开发.
这是我的GruntFile.js
var path = require('path');
module.exports = function(grunt){
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
uglify:{
options:{
banner:'/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
}
},
express:{
server:{
options:{
debug:true,
server: path.resolve('app.js')
}
}
},
env : {
options:{
},
dev : {
NODE_ENV : 'development'
},
prod : {
NODE_ENV : 'production'
}
},
mochaTest:{
test:{
options:{
reporter:'spec'
},
src:['tests/*.js']
}
}
});
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-express');
grunt.loadNpmTasks('grunt-env');
grunt.loadNpmTasks('grunt-mocha-test');
grunt.loadNpmTasks('grunt-shell');
// tasks
grunt.registerTask('start', ['env:dev', 'express', 'express-keepalive']);
grunt.registerTask('stop', ['express-stop']);
grunt.registerTask('test', 'mochaTest');
};
Run Code Online (Sandbox Code Playgroud)
我用我的本地服务器启动
咕噜声开始 …
如果你有像这样的发电机,
function* f () {
// Before stuff.
let a = yield 1;
let b = yield 2;
return [a,b];
}
Run Code Online (Sandbox Code Playgroud)
然后,跑
var g = f();
// this question is over this value.
g.next(123); // returns: { value: 1, done: false }
g.next(456); // returns: { value: 2, done: false }
g.next(); // returns: { value: [ 456, undefined ], done: true }
Run Code Online (Sandbox Code Playgroud)
第一次调用.next()设置a为123和第二次调用设置b为456,但是在最后一次调用时.next()返回,
{ value: [ 456, …Run Code Online (Sandbox Code Playgroud) 说我有这样的生成器函数:
var g = function*() {
yield 1;
yield 2;
yield 3;
};
var gen = g();
Run Code Online (Sandbox Code Playgroud)
如何以编程方式告诉它g是生成器函数,还是gen迭代器?
这似乎是一种可能性:
g.constructor.name === 'GeneratorFunction'
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
更新:我最终采取了类似于Eric的答案的方法,但eval首先使用首先确定目标平台是否支持生成器.这是实施:
var GeneratorConstructor = (function() {
try {
var generator;
return eval('generator = function*() { yield 1; };').constructor;
} catch (e) {
// If the above throws a SyntaxError, that means generators aren't
// supported on the current platform, which means isGenerator should
// always return …Run Code Online (Sandbox Code Playgroud) 我通过ES6功能和发电机引起了我的注意.出现在脑海中的一件事是链接Promise对象,我不能用循环来做.我们能做什么其他机制,我们以前不能做到?
我明白这是一个广泛的问题,但我现在还想不出什么,只有承诺.
根据标题,我正在尝试测试一些用nodejs运行的ES6 JS编写的AMD模块.
我首先尝试使用Intern:即使--harmony在nodejs中启用后,我最终还是面对了Intern的依赖链,我无法在例如伊斯坦布尔,esprima和其他人中启用Harmony (我为此开了一个问题).
然后我转移到摩卡上,在这里我被卡住...... 奇怪的是.我为nodejs和mocha本身启用了Harmony,这是package.json测试脚本:
"test": "node --harmony node_modules\\mocha\\bin\\mocha tests --harmony --recursive"
Run Code Online (Sandbox Code Playgroud)
我从命令提示符运行为npm test my_test_folder.仍然,一些ES6构造(如const)传递确定,但随后它在解构赋值时窒息.这是第一个输出行:
const { log, dir } = require('../consoleLogger.js');
^
SyntaxError: Unexpected token {
at Module._compile (module.js:439:25)
at Object.Module._extensions..js (module.js:474:10)
[...continues...]
Run Code Online (Sandbox Code Playgroud)
我也检查了这个SO线程并听说过转发器,但我真的不知道它们是否可以工作,我现在正试图让转换器在这种情况下工作.
关于如何解决这个问题的任何想法,而无需改变代码中传播的所有ES6位?TA.
看起来在任何生成器函数上调用.bind(this)会破坏我查看函数是否为生成器的能力.有想法该怎么解决这个吗?
var isGenerator = function(fn) {
if(!fn) {
return false;
}
var isGenerator = false;
// Faster method first
// Calling .bind(this) causes fn.constructor.name to be 'Function'
if(fn.constructor.name === 'GeneratorFunction') {
isGenerator = true;
}
// Slower method second
// Calling .bind(this) causes this test to fail
else if(/^function\s*\*/.test(fn.toString())) {
isGenerator = true;
}
return isGenerator;
}
var myGenerator = function*() {
}
var myBoundGenerator = myGenerator.bind(this);
isGenerator(myBoundGenerator); // false, should be true
Run Code Online (Sandbox Code Playgroud) 我最近遇到了Axel Rauschmayer博士的这篇精彩文章:
http://www.2ality.com/2015/02/es6-classes-final.html
下面的代码片段大致描述了ECMAScript 6原型链如何从ECMAScript 5的角度来看(原帖的第4.2节):
// ECMAScript 6
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
···
}
class ColorPoint extends Point {
constructor(x, y, color) {
super(x, y);
this.color = color;
}
···
}
let cp = new ColorPoint(25, 8, 'green');
Run Code Online (Sandbox Code Playgroud)
ECMAScript 5中的"引擎盖下"视图:
// ECMAScript 5
// Instance is allocated here
function Point(x, y) {
// Performed before entering this constructor:
this = Object.create(new.target.prototype);
this.x …Run Code Online (Sandbox Code Playgroud) 这就是我一直在做的事情:
var props = { id: 1, name: 'test', children: [] }
//copy props but leave children out
var newProps = { ...props }
delete newProps.children
console.log(newProps) // { id: 1, name: 'test' }Run Code Online (Sandbox Code Playgroud)
有更清洁,更简单的方法吗?
javascript ecmascript-harmony ecmascript-6 babeljs ecmascript-7
javascript ×10
ecmascript-6 ×4
generator ×4
node.js ×3
babeljs ×1
ecmascript-7 ×1
ember.js ×1
express ×1
gruntjs ×1
intern ×1
mocha.js ×1
mongoose ×1
subclass ×1
v8 ×1