mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-11-22 06:21:45 +03:00
add another javascript test
This commit is contained in:
parent
12f874cd92
commit
16c1059723
@ -23,5 +23,9 @@
|
||||
<li><a href="doc-dom1.html">Direct reference</a></li>
|
||||
<li><a href="doc-dom2.html">getElementById reference</a></li>
|
||||
</ul>
|
||||
<h2>Assorted</a>
|
||||
<ul>
|
||||
<li><a href="wikipedia-lcm.html">Example from wikipedia</a></li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
|
9
test/js/wikipedia-lcm.html
Normal file
9
test/js/wikipedia-lcm.html
Normal file
@ -0,0 +1,9 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Wikipedia lcm script</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Wikipedia lcm script</h1>
|
||||
<script src="wikipedia-lcm.js"></script>
|
||||
</body>
|
||||
</html>
|
70
test/js/wikipedia-lcm.js
Normal file
70
test/js/wikipedia-lcm.js
Normal file
@ -0,0 +1,70 @@
|
||||
/* Finds the lowest common multiple (LCM) of two numbers */
|
||||
function LCMCalculator(x, y) { // constructor function
|
||||
var checkInt = function (x) { // inner function
|
||||
if (x % 1 !== 0) {
|
||||
throw new TypeError(x + " is not an integer"); // throw an exception
|
||||
}
|
||||
return x;
|
||||
};
|
||||
this.a = checkInt(x)
|
||||
// ^ semicolons are optional
|
||||
this.b = checkInt(y);
|
||||
}
|
||||
// The prototype of object instances created by a constructor is
|
||||
// that constructor's "prototype" property.
|
||||
LCMCalculator.prototype = { // object literal
|
||||
constructor: LCMCalculator, // when reassigning a prototype, set the constructor property appropriately
|
||||
gcd: function () { // method that calculates the greatest common divisor
|
||||
// Euclidean algorithm:
|
||||
var a = Math.abs(this.a), b = Math.abs(this.b), t;
|
||||
if (a < b) {
|
||||
// swap variables
|
||||
t = b;
|
||||
b = a;
|
||||
a = t;
|
||||
}
|
||||
while (b !== 0) {
|
||||
t = b;
|
||||
b = a % b;
|
||||
a = t;
|
||||
}
|
||||
// Only need to calculate GCD once, so "redefine" this method.
|
||||
// (Actually not redefinition—it's defined on the instance itself,
|
||||
// so that this.gcd refers to this "redefinition" instead of LCMCalculator.prototype.gcd.)
|
||||
// Also, 'gcd' === "gcd", this['gcd'] === this.gcd
|
||||
this['gcd'] = function () {
|
||||
return a;
|
||||
};
|
||||
return a;
|
||||
},
|
||||
// Object property names can be specified by strings delimited by double (") or single (') quotes.
|
||||
"lcm" : function () {
|
||||
// Variable names don't collide with object properties, e.g. |lcm| is not |this.lcm|.
|
||||
// not using |this.a * this.b| to avoid FP precision issues
|
||||
var lcm = this.a / this.gcd() * this.b;
|
||||
// Only need to calculate lcm once, so "redefine" this method.
|
||||
this.lcm = function () {
|
||||
return lcm;
|
||||
};
|
||||
return lcm;
|
||||
},
|
||||
toString: function () {
|
||||
return "LCMCalculator: a = " + this.a + ", b = " + this.b;
|
||||
}
|
||||
};
|
||||
|
||||
//define generic output function; this implementation only works for web browsers
|
||||
function output(x) {
|
||||
document.body.appendChild(document.createTextNode(x));
|
||||
document.body.appendChild(document.createElement('br'));
|
||||
}
|
||||
|
||||
// Note: Array's map() and forEach() are defined in JavaScript 1.6.
|
||||
// They are used here to demonstrate JavaScript's inherent functional nature.
|
||||
[[25, 55], [21, 56], [22, 58], [28, 56]].map(function (pair) { // array literal + mapping function
|
||||
return new LCMCalculator(pair[0], pair[1]);
|
||||
}).sort(function (a, b) { // sort with this comparative function
|
||||
return a.lcm() - b.lcm();
|
||||
}).forEach(function (obj) {
|
||||
output(obj + ", gcd = " + obj.gcd() + ", lcm = " + obj.lcm());
|
||||
});
|
Loading…
Reference in New Issue
Block a user