knockout.js库有一个"attr"
数据绑定,允许您动态更改HTML元素属性的值(例如"标题").但是,在某些情况下,取决于绑定对象上的相应可观察对象,可能需要也可能不需要该属性.例如,如果我的模型有一个"标题"可观察,我可能想要设置"title"属性(如果它存在(非空))或完全跳过该属性(如果它不存在(null)).
knockout是否提供了有条件地设置属性的方法?(理想情况下,无需有条件地渲染整个元素的开放标记......)
[注意]这个类似命名的问题实际上是通过敲除特殊处理CSS类来解决的,并不涉及这个问题(或它自己的标题):如何使用knockoutjs有条件地呈现一个css类
假设我得到这样的路线:
app.get('/documents/format/type', function (req, res) {
var format = req.params.format,
type = req.params.type;
});
Run Code Online (Sandbox Code Playgroud)
所以如果我提出要求的话
http://localhost:3000/documents/json/mini
Run Code Online (Sandbox Code Playgroud)
在我的格式和类型变量将分别是'json'和'mini',但如果我提出请求
http://localhost:3000/documents/mini/json
Run Code Online (Sandbox Code Playgroud)
不.所以我的问题是:如何以不同的顺序获得相同的变量?
对于Java中的某些散列函数,将值视为无符号整数(例如,与其他实现进行比较)会很好,但Java仅支持有符号类型.我们可以将签名转换为int
"未签名" long
,如下所示:
public static final int BITS_PER_BYTE = 8;
public static long getUnsignedInt(int x) {
ByteBuffer buf = ByteBuffer.allocate(Long.SIZE / BITS_PER_BYTE);
buf.putInt(Integer.SIZE / BITS_PER_BYTE, x);
return buf.getLong(0);
}
getUnsignedInt(-1); // => 4294967295
Run Code Online (Sandbox Code Playgroud)
但是,这个解决方案对我们真正做的事情来说似乎有些过分.有没有更有效的方法来实现同样的事情?
在JavaScript中使用随机数字时,我发现了一个令人惊讶的错误,可能是谷歌Chrome中的V8 JavaScript引擎.考虑:
// Generate a random number [1,5].
var rand5 = function() {
return parseInt(Math.random() * 5) + 1;
};
// Return a sample distribution over MAX times.
var testRand5 = function(dist, max) {
if (!dist) { dist = {}; }
if (!max) { max = 5000000; }
for (var i=0; i<max; i++) {
var r = rand5();
dist[r] = (dist[r] || 0) + 1;
}
return dist;
};
Run Code Online (Sandbox Code Playgroud)
现在,当我运行时,testRand5()
我得到以下结果(当然,每次运行略有不同,您可能需要将"max"设置为更高的值以显示错误):
var d = testRand5();
d = {
1: …
Run Code Online (Sandbox Code Playgroud) 在JavaScript中,我们可以为函数的原型分配属性或直接设置其原型对象:
var MyClass = function() { };
// The "property" form...
MyClass.prototype.foo = function() { ... };
MyClass.prototype.bar = function() { ... };
MyClass.prototype.gah = function() { ... };
// OR the "assignment" form...
MyClass.prototype = {
foo:function() { ... },
bar:function() { ... },
gah:function() { ... }
};
Run Code Online (Sandbox Code Playgroud)
我个人更喜欢分配表单,因为您可以轻松地将对象包装在一个闭包中(例如隐藏"私有"对象),如果您以后决定更改"MyClass"的名称,您只需找到两个点而不是潜在的许多.(当然,对于"属性"形式也可以这样说,通过使用和调用一个以现有原型作为参数的函数,但在我看来,"赋值"形式似乎更直接.)
是否有充分的理由使用一种形式而不是另一种形式?
[编辑]
正如评论者@Raynos所提到的,第二种形式(赋值)破坏了prototype.constructor
属性,该属性应该设置为MyClass函数(默认情况下是第一种形式[property]).这有什么真正的缺点(除了未设置属性的事实)?
我们可以很容易地得到所需范围内的随机浮点数[X,Y)
(注意X是包含的,Y是独占的),下面列出了函数,因为Math.random()
(大多数伪随机数生成器,AFAIK)产生的数字在[0,1)
:
function randomInRange(min, max) {
return Math.random() * (max-min) + min;
}
// Notice that we can get "min" exactly but never "max".
Run Code Online (Sandbox Code Playgroud)
我们怎样才能得到一个包含两个边界的期望范围内的随机数,即[X,Y]
?
我想我们可以Math.random()
通过"滚动" IEE-754浮点双精度的位来"增加"我们的值(或等效),将最大可能值精确地设置为1.0,但这似乎很难实现,特别是语言不适合比特操纵.有没有更简单的方法?
(顺便说一句,为什么随机数生成器会产生数字[0,1)
而不是[0,1]
?)
[编辑]请注意,我没有必要这样做,我完全清楚这种区别是迂腐的.只是好奇并希望得到一些有趣的答案.如果这个问题不合适,请随意投票结束.
根据MDN文档,new Array(length)
我可以初始化具有给定长度的数组:
var a = new Array(10);
a.length; // => 10
a; // => [undefined x 10]
Run Code Online (Sandbox Code Playgroud)
但是,显然我不能使用诸如map(...)
新数组之类的方法,即使以其他方式构造的数组工作正常:
a.map(function() { return Math.random(); });
// => [undefined x 10] -- wtf?
[undefined, undefined].map(function() { return Math.random(); });
// => [0.07192076672799885, 0.8052175589837134]
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
我从这个经验(并在网上搜索)中了解到,具有长度的数组构造函数是一个无法解释的行为的黑洞,但ECMA 262规范是否提供了解释?
像Ruby和JavaScript这样的语言有开放类,允许你修改偶数核心类的接口,如数字,字符串,数组等.显然,这样做可能会使熟悉API的其他人感到困惑,但是有充分的理由要避免使用它们. ,假设您正在添加到界面而不是更改现有行为?
例如,将一个Array.map实现添加到未实现ECMAScript第5版的Web浏览器(如果您不需要所有jQuery)可能会很好.或者你的Ruby数组可能会受益于使用"inject"的"sum"方便方法.只要更改被隔离到您的系统(例如,不是您发布用于分发的软件包的一部分),是否有充分的理由不利用此语言功能?
go语言规范的"Map types"部分描述了地图类型的界面和一般用法,The Go Blog上的"Go maps in action"帖子随便提到了哈希表和"快速查找,添加和删除".
的电流runtime/hashmap.go
源代码描述了其作为散列表实施方案(其通常摊销O(1)
); 但是,我没有看到语言规范或其他材料中的性能特征(例如Big O性能)的任何保证.
go语言是否为地图类型或仅提供接口保证提供任何性能保证(例如,恒定时间插入/查找/删除?)?(与接口和实现明显分开的Java语言相比.)
如何在不修改原型的情况下扩展核心JavaScript类型(String,Date等)?例如,假设我想用一些方便的方法创建一个派生的字符串类:
function MyString() { }
MyString.prototype = new String();
MyString.prototype.reverse = function() {
return this.split('').reverse().join('');
};
var s = new MyString("Foobar"); // Hmm, where do we use the argument?
s.reverse();
// Chrome - TypeError: String.prototype.toString is not generic
// Firefox - TypeError: String.prototype.toString called on incompatible Object
Run Code Online (Sandbox Code Playgroud)
该错误似乎源自String基本方法,在这种情况下可能是"拆分",因为它的方法正在应用于某些非字符串对象.但是如果我们不能应用非字符串对象那么我们真的可以自动重用它们吗?
[编辑]
显然,我的尝试在很多方面存在缺陷,但我认为这证明了我的意图.经过一番思考后,似乎我们不能重用任何String原型对象的函数而不在String上显式调用它们.
是否可以扩展核心类型?