为什么这些手写笔散列的行为不一样?

why don't these stylus hashes behave the same?

在我的 Javascript:

// styl is the stylus compiler instance
styl.define('passedHash', new stylus.nodes.Object({
  top: 0,
  right: 2,
  bottom: 5,
  left: 20
}));

在我的 .styl 文件中:

localHash = {
  top: 0
  right: 2
  bottom: 5
  left: 20
}
.fooBar
  nodeType typeof(localHash)
  padding unit(localHash['top'], 'px')
  nodeType typeof(passedHash)
  padding: unit(passedHash['top'], 'px')

编译输出变为:

.fooBar {
  nodeType: 'object';
  padding: 0px;
  nodeType: 'object';
}

如果我取消注释手写笔中的最后一行,我希望 passedHash 的填充规则与 localHash 完全相同。但是,手写笔崩溃了:

TypeError: expected "unit" to be a unit, but got null:null

为什么?编译器知道它们都是对象……它们对我来说似乎是同一个对象……

好吧,根据 Object 节点 (https://github.com/LearnBoost/stylus/blob/master/lib/nodes/object.js) 的来源,您不能将 JS 对象传递给它的构造函数。所以你的 passedHash 是空的,你得到了那个错误。但是,您可以使用以下代码将真实的 JS 对象强制转换为 Stylus 对象:

styl.define('passedHash', {
  top: 0,
  right: 2,
  bottom: 5,
  left: 20
}, true); // <-- true for raw coercion

或更详细的版本:

styl.define('passedHash', stylus.utils.coerceObject({
  top: 0,
  right: 2,
  bottom: 5,
  left: 20
}, true));