質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

3364閲覧

paizaのスキルチェックでおかしなことになります........

dialbird

総合スコア379

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

1クリップ

投稿2016/04/06 14:00

こんばんは

paizaのスキルチェックをしていておかしなことになったので質問しました。

現在JavaScriptで進めているのですが、

javascript

1process.stdin.on('data', function (chunk) { 2 //lineには'B'と入っています 3 var line = chunk.toString(); 4 console.log(line); //B 5 console.log('B'); //B 6 console.log(line === 'B'); //false(なぜかtrueにならない) 7 console.log(typeof(line) === typeof('km')); //true 8 check(); 9});

というふうによくわからないことになります。
ちなみに自分が使っているエディターに打つと3番目もtrueになります

これはpaizaのエディターの仕様なのでしょうか?
もしくは何か別の問題があるのでしょうか........

よろしくお願いいたします。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

確かに?変な気がしますね、、、
と書きながら、自分も曖昧になってきました。

console.log(line === 'B'); //false(なぜかtrueにならない)

厳密比較なので、lineは、文字列で、かつ'B'でなくてはならない。

var line = chunk.toString();

toStringは、文字列を戻す(ハズ)。
なので、確かに、trueになってよさそうです。
実際にブラウザのJavaScriptではtrueです(一応Chromeで検証)。

ただ、たとえば、

var newB = new String('B'); console.log(newB === 'B');

これは、falseです(newBはオブジェクトなので・・・)。

なので、たとえば、paisaの内部のJavaScriptの実装の、obj.toString()が、new String()、的にオブジェクトを戻すように実装されているとか???

あと、
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/toString

こちらの記載で、
「JavaScript 1.2 では、デフォルトの toString メソッドはオブジェクトリテラルを返します。」
こんな記載が・・・。

Number.prototype.toString()は、文字列返却ですが、
JavaScript 1.2 では、Object.prototype.toString()は、オブジェクトリテラル!

嫌な感じですね、、、

私の現場では、明示型変換を基本的に行うなど、そのそもの変数の型を固定しておき、===や!==はできるだけ使わないというルールにしていますので、勉強不足だったりします。

賢者の型(いや方)!お助けください!

投稿2016/04/06 22:06

ItoTomonori

総合スコア1283

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dialbird

2016/04/06 23:40

Ito Tomonoriさん ご返答ありがとうございます! 下にも書かせていただきましたが、文末の改行が悪さをしていた様です。 今までは華麗にスルーできていたのがむしろ不思議なのですが、これも経験ということにしておきます。 ありがとうございました!
guest

0

ベストアンサー

改行コードが右端に入っている,とかのオチでしょう.末尾の改行コードを削除すればいいだけですが,それに加えて一応確実に行単位で読み出しができるように書いてみます.(Node.js v5.10.0 で動作確認)

(reader.js)

javascript

1'use strict'; 2 3class LineReader 4{ 5 constructor(stream) 6 { 7 this.stream = stream; 8 } 9 10 onLine(handler) 11 { 12 let buffer = ''; 13 this.stream.on('data', chunk => { 14 buffer += chunk.toString(); 15 let m; 16 while (m = buffer.match(/([\s\S]*?)\r?\n([\s\S]*)/m)) { 17 handler(m[1]); 18 buffer = m[2]; 19 } 20 }); 21 this.stream.on('end', () => { 22 let str = buffer; 23 buffer = ''; 24 if (str !== '') { 25 handler(str); 26 } 27 }); 28 return this; 29 } 30} 31 32new LineReader(process.stdin).onLine(line => console.log(JSON.stringify(line)));

試しに以下のようなコードの出力を流し込んでみてください.

(writer.js)

JavaScript

1'use strict'; 2 3function sleep(ms) 4{ 5 return new Promise(r => setTimeout(r, ms)); 6} 7 8Promise 9.resolve() 10.then(() => process.stdout.write("1行目: ")) 11.then(() => sleep(500)) 12.then(() => process.stdout.write("ab\n2行目: def")) 13.then(() => sleep(500)) 14.then(() => process.stdout.write("\n")) 15.then(() => sleep(500)) 16.then(() => process.stdout.write("3行目: 改行無しで終わります"))

(ターミナル)

Bash

1node writer.js | node reader.js

投稿2016/04/06 21:28

編集2016/04/06 21:57
mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dialbird

2016/04/06 23:38

CertaiNさん ご返答ありがとうございます! おっしゃる通り文末の改行が原因だったみたいです........ Promiseとかが出てくるコードはもう少ししたら手を出してみます........ ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問